簡體   English   中英

Chrome 跨域 PATCH 請求不起作用

[英]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 服務端為每個請求設置以下響應標頭:

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

  2. (“訪問控制允許方法”,“POST,PUT,GET”)

  3. (“訪問控制允許來源”,“*”)

是關於 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。 在屬性窗口中將“匿名身份驗證”設置為已啟用!!!

我知道這是一個舊帖子,但我偶然發現了同樣的問題。 為我解決這個問題的事情是在我在后端設置 cors 之前卸載我在 chrome 中允許 cors 的擴展。 可以在此處找到擴展: https ://chrome.google.com/webstore/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf ?hl= en。 因此,請確保您在 chrome 中沒有任何可能會搞砸的擴展。

為什么不使用PUT而不是PATCH和您的請求類型。 他們幾乎做同樣的事情

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM