Chrome跨域PATCH请求不起作用

Chrome Cross-Domain PATCH request not working

本文关键字:不起作用 请求 PATCH 跨域 Chrome      更新时间:2023-09-26

我有一个带有REST-Api的网站,现在我正在创建一个浏览器扩展,它将从一些页面收集数据并将其发送回REST-Api。因为我希望我的扩展与firefox和chrome都兼容,并且易于维护,所以我将实际代码作为脚本标记注入页面,然后像普通javascript一样执行。我目前只在chrome版本的扩展上工作,我遇到了一个问题:

当我试图将我的数据发送到api(PATCH请求)时,chrome不会让我说:

XMLHttpRequest无法加载http://my.rest/api.起源http://website.com访问控制允许来源不允许。

我已经将访问控制允许标头、方法和原点都设置为正确的值,但它仍然不起作用。不过,它可以处理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,应该是最新的。

我在使用CORS 的node.js中遇到了类似的问题

您需要将Access-Control-Allow-Origin设置为特定域,而不是通配符。

示例:Access-Control-Allow-Originhttp://website.com

(你可以在你的服务器上有一个允许的来源数组,并检查如果请求被允许,则使用该请求进行回答通配符。)

此外,您还可以将Access-Control-Allow-Methods标头设置为选项列表,如:

POST, GET, OPTIONS, DELETE, PUT

您应该在响应标头中允许OPTIONS。。

"访问控制允许方法"、"GET、POST、HEAD、OPTIONS、PUT、DELETE"

我知道这是一篇旧帖子,但我偶然发现了同样的问题。对我来说,解决这个问题的方法是在后台设置cors之前,卸载chrome中允许cors的扩展。扩展可以在这里找到:https://chrome.google.com/webstore/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf?hl=en.所以,请确保你没有任何铬的扩展,这可能会搞砸。

我在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服务端,为每个请求设置以下响应头:

  1. ("Access Control Allow Headers"、"Accept")或("Access Control Allow Headers",HTTPRequest.RequestedHeaders+"Accept")

  2. ("访问控制允许方法"、"POST、PUT、GET")

  3. ("Access Control Allow Origin","*")

这里是一篇关于CORS工作的好文章,它真的帮助了我。

在您的WebApi:中

Microsoft.AspNet.WebApi.CorsNuGet包添加到项目

确保您还在全局、控制器或操作中注册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

}

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

[EnableCors(origins: "http://localhost:[*port #*]", headers: "*", methods: "*")]

注意:*是"通配符",可能需要放置发出请求的域例如:(http://localhost:[端口#])

一些很容易错过/忘记的事情。。。

在解决方案资源管理器中,右键单击api项目。在属性窗口中,将"匿名身份验证"设置为"已启用!!!"

为什么不直接使用PUT而不是PATCH和您的请求类型。他们几乎做同样的事情