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-Originhttp://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

ControllerAction - 如果需要/需要在这些级别提供支持(此将覆盖全局设置 - 操作 > 控制器 > 配置)。以上控制器或动作签名:

[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 跨域补丁请求不起作用的主要内容,如果未能解决你的问题,请参考以下文章

子资源完整性保护在 Chrome 中不起作用

跨域 AJAX 请求不起作用

CORS POST 请求不起作用 - 选项(错误请求) - 不允许来源

asp.net signalr core 中的跨域请求不起作用?

Ruby on Rails - AJAX 请求不起作用(跨域),尝试了一切

跨域请求在 SignalR 2.0.0-rc1 中不起作用