Chrome 跨域补丁请求不起作用
Posted
技术标签:
【中文标题】Chrome 跨域补丁请求不起作用【英文标题】:Chrome Cross-Domain PATCH request not working 【发布时间】:2013-07-02 08:52:35 【问题描述】:我有一个带有 REST Api 的网站,现在我正在创建一个浏览器扩展程序,它将从一些页面收集数据并将它们发送回 REST Api。因为我希望我的扩展与 firefox 和 chrome 兼容,并且易于维护,所以我将实际代码作为脚本标记注入页面,然后像普通 javascript 一样执行。 我目前只使用 chrome 版本的扩展程序,但遇到了问题:
当我尝试将数据发送到 api(PATCH 请求)时,chrome 不会让我说:
XMLHttpRequest 无法加载 http://my.rest/api。 Access-Control-Allow-Origin 不允许来源http://website.com。
我将 Access-Control-Allow-Headers、Methods 和 Origin 都设置为正确的值,但它仍然不起作用。但它适用于 GET 请求。我也尝试过 POST 和 PUT 请求,但它们也不起作用。
这是我的标题:
请求:
OPTIONS /some/api/path HTTP/1.1
Host: my.rest
Connection: keep-alive
Access-Control-Request-Method: PATCH
Origin: http://website.com
User-Agent: Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/27.0.1453.116 Safari/537.36
X-FireLogger: 1.1
Access-Control-Request-Headers: accept, x-http-auth-user, x-http-auth-token, origin, content-type
Accept: */*
Referer: http://website.com/index.php
Accept-Encoding: gzip,deflate,sdch
Accept-Language: cs-CZ,cs;q=0.8
回复:
Access-Control-Allow-Headers:accept, x-http-auth-user, x-http-auth-token, origin, content-type
Access-Control-Allow-Methods:PATCH
Access-Control-Allow-Origin:*
Connection:Keep-Alive
Content-Type:text/html; charset=utf-8
Date:Thu, 04 Jul 2013 10:50:08 GMT
Keep-Alive:timeout=5, max=100
Server:Apache/2.4.2 (Win64) PHP/5.4.3
X-Frame-Options:SAMEORIGIN
X-Powered-By:Nette Framework
我也尝试将 Access-Control-Allow-Origin 设置为与 Origin 标头完全相同的值,但它不起作用。此外,它似乎在 Firefox 中工作。我有 Chrome 27,应该是最新的。
【问题讨论】:
尝试添加这个--disable-web-security
我不是为自己开发这个扩展,我不能要求想要使用它的人来做这个。
你在使用jsonp吗?
不,我正在使用CORS。您还应该阅读这篇文章虽然 JSONP 仅支持 GET 请求方法,但 CORS 还支持其他类型的 HTTP 请求。我需要从服务器而不是从服务器获取数据。
很奇怪的是它现在可以工作了,我不知道服务器或客户端的任何变化会导致这种情况。它发生在 chrome 更新到第 28 版之后,但我很确定它在第 28 版中暂时无法正常工作。
【参考方案1】:
我知道这是一篇旧帖子,但我偶然发现了同样的问题。为我解决这个问题的事情是在我在后端设置 cors 之前卸载我在 chrome 中允许 cors 的扩展。可以在此处找到扩展名:https://chrome.google.com/webstore/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf?hl=en。因此,请确保您在 chrome 中没有任何可能搞砸的扩展。
【讨论】:
【参考方案2】:我在使用 CORS 的 node.js
中遇到了类似的问题
您需要将Access-Control-Allow-Origin
设置为特定域而不是通配符。
示例:Access-Control-Allow-Origin
到 http://website.com
(您可以在您的服务器上拥有一组允许的来源并检查 如果允许,则反对该请求,然后用该请求回答 通配符。)
此外,您可以将 Access-Control-Allow-Methods
标头设置为以下选项列表:
POST, GET, OPTIONS, DELETE, PUT
【讨论】:
正如我在问题中所写,我尝试将其设置为与 Origin 标头相同的值,但没有成功。根据规范,应该允许使用通配符。将 Access-Control-Allow-Methods 设置为多个值也无济于事。 他们为什么要强制采取这样的行动?【参考方案3】:为什么不直接使用PUT
而不是PATCH
和您的请求类型。他们几乎做同样的事情
【讨论】:
因为那是错误的动词,他们不会做同样的事情。 PATCH 用于更改某物的属性,PUT 用于替换整个对象。【参考方案4】:在您的 WebApi 中:
添加 Microsoft.AspNet.WebApi.Cors NuGet 包到项目
确保您还在全局、控制器或操作中注册 CORS 支持。
全球 - 在 App_Start 文件夹中的 WebApiConfig.cs 文件中添加:
public static void Register(HttpConfiguration config)
// New code:
var cors = new EnableCorsAttribute(
origins: "*",
headers: "*",
methods: "*");
config.EnableCors(cors);
// Other configurations
Controller 或 Action - 如果需要/需要在这些级别提供支持(此将覆盖全局设置 - 操作 > 控制器 > 配置)。以上控制器或动作签名:
[EnableCors(origins: "http://localhost:[*port #*]", headers: "*", methods: "*")]
注意: * 是“通配符”,可能要放入发出请求的域 ex:(http://localhost:[port #] )
一些很容易错过/忘记的东西......
在解决方案资源管理器中,右键单击 api-project。在属性窗口中将“匿名身份验证”设置为启用!!!
【讨论】:
【参考方案5】:我在 Chrome 27.0.1453.116 上尝试了 CORS,它对我有用。 在客户端,我所做的只是在 jquery AJAX 中将 'crossDomain' 设置为 true。
$.ajax('http://localhost/Elements.Services/Elements.svc/REST/Element/Get?ID=1',
type: 'GET',
crossDomain: true,
success: function (data)
alert(data);
);
在 REST 服务端为每个请求设置以下响应标头:
(“访问控制允许标头”,“接受”) 要么 ("Access-Control-Allow-Headers", HTTPRequest.RequestedHeaders + "Accept")
("Access-Control-Allow-Methods", "POST,PUT,GET")
("Access-Control-Allow-Origin", "*")Here 是关于 CORS 工作的好文章,对我很有帮助。
【讨论】:
正如我在问题中所说,GET 对我来说也可以正常工作,但其他请求会导致问题。 我也尝试过使用 POST,它工作正常,但不能使用 PUT/DELETE。 您是否尝试过添加自定义标题?很难说,我并不是说它不应该起作用,因为它应该起作用。我只是说它对我不起作用,现在它起作用了。 没关系。如果它现在工作。很好。有时我们会遇到很难重现/理解的非常奇怪的问题。 (不使用任何自定义标题)【参考方案6】:您应该在响应标头中允许 OPTIONS..
“访问控制允许方法”、“GET、POST、HEAD、OPTIONS、PUT、DELETE”
【讨论】:
我现在允许了,但无论如何也没有用。 并且还允许 PATCH 一样...我想你已经添加了这个 是的 PATCH 是允许的,阅读我对主要问题的评论,它现在有效,但我不知道为什么:-)以上是关于Chrome 跨域补丁请求不起作用的主要内容,如果未能解决你的问题,请参考以下文章
CORS POST 请求不起作用 - 选项(错误请求) - 不允许来源
asp.net signalr core 中的跨域请求不起作用?