2013-07-04 98 views
11

我有一個REST Api網站,現在我正在創建一個瀏覽器擴展,它將從一些頁面收集數據並將它們發送回REST Api。因爲我希望我的擴展與firefox和chrome兼容,並且易於維護,所以我將實際的代碼作爲腳本標記注入頁面,然後像普通的javascript一樣執行。 我目前只在鉻版本的擴展和我遇到了一個問題:Chrome跨域PATCH請求不起作用

當我試圖發送我的數據到API(PATCH請求),鉻不會讓我說:

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 

從來就還嘗試設置訪問控制允許來源以完全相同的價值爲原點頭,但它沒有工作。此外,它似乎在Firefox中工作。我有Chrome 27,它應該是最新的。

+0

嘗試添加這個'--disable-web-security' –

+1

我沒有爲自己開發這個擴展,我不能問那些想用它來做這件事的人。你使用[jsonp](http://en.wikipedia.org/wiki/JSONP)是否使用 – hynner

+0

? –

回答

6

我在node.js中面臨類似的問題,CORS

您需要設置「訪問控制允許來源」特定於域不是通配符

例如:「訪問控制 - 允許原產地到‘http://website.com

(你可以有你的服務器上允許起源的數組,並覈對該請求是否被允許然後用一個,而不是通配符接聽)

你也可以設置'Access-Co ntrol-允許的方法標頭的類似的選項列表:

'POST,GET,OPTIONS,DELETE,把'

+0

正如我在我的問題中寫的,我試圖將它設置爲與Origin頭相同的值,但沒有運氣。根據規範通配符應該被允許。將Access-Control-Allow-Methods設置爲多個值也沒有幫助。 – hynner

6

你應該讓你的響應頭選項..

「訪問 - Control-Allow-Methods「,」GET,POST,HEAD,OPTIONS,PUT,DELETE「

+0

我現在允許它,但它無論如何不會有幫助。 – hynner

+0

並且還允許PATCH相同...我想你已經添加了這個 –

+0

是的PATCH是允許的,閱讀我對主要問題的評論,現在有效,但我不確定爲什麼:-) – hynner

0

我試過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. (「接入控制允許包頭」,「接受」) 或 (「訪問 - 控制允許頭 「HTTPRequest.RequestedHeaders + 」接受「)

  2. ( 」訪問控制允許的方法「, 」POST,PUT,GET「)

  3. (」 A ccess-Control-Allow-Origin「,」*「)

Here是關於CORS工作的很棒的文章,對我非常有幫助。

+0

正如我在問題中所說的,GET也適用於我,但其他請求導致了一個問題。 – hynner

+0

我嘗試使用POST以及它工作正常,但不與PUT/DELETE。 –

+0

您是否嘗試過添加自定義標題?這很難說,我不是說它不應該工作,因爲它應該。我只是說它不適合我,現在它可以工作。 – hynner

0

在你的WebAPI:

添加Microsoft.AspNet.WebApi.Cors NuGet包到項目

請確保您還寄存器CORS支持無論是在全球範圍內,在控制器,或在行動。

全球 - 在你WebApiConfig.cs文件從App_Start添加文件夾:

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-project。在屬性窗口設置'匿名身份驗證'啓用!

0

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