[英]Chrome Cross-Domain PATCH request not working
我有一個帶有 REST Api 的網站,現在我正在創建一個瀏覽器擴展程序,它將從某些頁面收集數據並將它們發送回 REST Api。 因為我希望我的擴展程序與 firefox 和 chrome 兼容,並且易於維護,所以我將實際代碼作為腳本標記注入頁面,然后像普通的 javascript 一樣執行。 我目前只在擴展的 chrome 版本上工作,我遇到了一個問題:
當我嘗試將數據發送到 api(PATCH 請求)時,chrome 不會讓我說:
XMLHttpRequest 無法加載http://my.rest/api 。 Access-Control-Allow-Origin 不允許 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,它應該是最新的。
我在帶有 CORS 的node.js
遇到了類似的問題
您需要將Access-Control-Allow-Origin
設置為特定域而不是通配符。
示例:對http://website.com
Access-Control-Allow-Origin
(您可以在您的服務器上設置一組允許的源,並檢查請求是否允許,然后用那個而不是通配符回答。)
此外,您可以將Access-Control-Allow-Methods
標頭設置為選項列表,例如:
POST, GET, OPTIONS, DELETE, PUT
你應該在你的響應頭中允許 OPTIONS ..
“訪問控制允許方法”、“GET、POST、HEAD、OPTIONS、PUT、DELETE”
我在 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", "Accept") 或 ("Access-Control-Allow-Headers", HTTPRequest.RequestedHeaders + "Accept")
(“訪問控制允許方法”,“POST,PUT,GET”)
這是關於 CORS 工作的好文章,它真的幫助了我。
在您的 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
}
控制器或操作 -如果需要/需要在這些級別放置支持(這將覆蓋全局設置- 操作 > 控制器 > 配置)。 上面的控制器或動作簽名:
[EnableCors(origins: "http://localhost:[*port #*]", headers: "*", methods: "*")]
注意: * 是“通配符”,可能需要將發出請求的域放在前:( http://localhost:[ port # ])
很容易錯過/忘記的東西......
在解決方案資源管理器中,右鍵單擊 api-project。 在屬性窗口中將“匿名身份驗證”設置為已啟用!!!
為什么不使用PUT
而不是PATCH
和您的請求類型。 他們幾乎做同樣的事情
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.