2014-09-10 105 views
3

我花了幾天的時間試圖確定爲什麼當我從Chrome v36.xxx更新到v37.yyy(特別是37.0.2062.103)時,我的CORS應用突然開始出現故障)在我的應用程序中,我在不同的端口上運行一個MVC站點和一個WebAPI。這是跨域進入事物的地方。CORS,在Chrome v36中工作,在Chrome v37中失敗

我有幾個實例(dev,uat,prod)都採用相同的方式。全部用於工作。

XMLHttpRequest無法加載 http://「mywebapihost」:「mywebapiport」/api/v1.0/myapp/。否 「訪問控制 - 允許來源」標題出現在請求的 資源中。 Origin'http://「mymvchost」'因此不被允許訪問。

似乎是預檢中OPTIONS請求的問題 - 我在網上看到過很多。

但是 - 我不覺得更接近「修復」我的問題(其中「修復」==能夠在Chrome中運行)。

事情,我可以說出我的系統:

(1)具有總是v36.xxx工作,但不是因爲37.0.2062.103更新 (2)在IE (3)作品的變得更加的最新的Chrome (4)即使在最新的Chrome中也能正常工作。如果我有Fiddler運行(我不把它當作修補程序)

我試過了。

1)強制在調用的jQuery的Ajax調用標題,以嘗試獲取授權進入OPTIONS調用 - 建議從網上

beforeSend: function (xhr) { 
    xhr.setRequestHeader('Authorization', make_base_auth("<username>", "<password>")); 
}, 
headers: { 
    "Authorization": "Basic " + btoa("<username>" + ":" + "<password>") 
} 

2)我下載的Chrome Canary v39.0.2150.3希望這個問題將會消失 - 仍然會出現同樣的問題。

如果有人有任何建議,我將非常感激,我不得不改變爲運行IE瀏覽器只是爲了取得進展!

+0

來源報告顯然是錯誤的。你是否將其作爲本地機器的測試運行? – Rhys 2014-09-10 12:52:12

+0

編輯製成。我爲mvc主機,webapi主機和webapi端口放置了佔位符,但由於我將它們放在「<" and ">」之內,所以未能顯示在帖子中。 順便說一句 - mvc主機和web api主機是一樣的。只有端口不同,顯然仍然被視爲「跨域」。 – chrisward 2014-09-10 13:49:40

+0

您可以調試服務器以瞭解它爲什麼不附加Access-Control-Allow-Origin標頭嗎? – Rhys 2014-09-10 15:22:42

回答

0

爲了關閉我在這裏回答我自己的問題。它可能會在未來幫助某人。

我所做的是創建一個完全乾淨的,最小工作的WebAPI項目,它實現了GET,PUT,POST和DELETE。我按預期工作,然後嘗試跨域(相同的服務器,但網頁運行JS Ajax在端口80上,WebAPI在端口7694上運行)。

這可預測失敗。所以然後我啓用了CORS所需的nuget包,在WebApiConfigcs中添加了

 config.EnableCors(); 

在我很小的WebAPI控制器我加入了

[EnableCors(origins: "*", headers: "*", methods: "*", SupportsCredentials = true)] 

所有這一切工作按預期。

然而,當我再安裝相同的控制器等爲我現有的,失敗的WebAPI部署它促使我原來的問題的方式失敗。

所以它有配置的氣味。

事實證明,通過清理IIS服務器和我正在部署的WebAPI項目的配置可以解決這個問題。我試圖讓飛行前OPTIONS請求正常工作時,我對這兩個問題都有太多的瞭解。

Specificall,Web.Config中我已經加入

<system.web> 
    .... 
    .... 
    <!--<authentication mode="Windows" />--> 
    <authorization> 
     <deny users="?" /> 
     <allow verbs="OPTIONS" users="?" /> 
    </authorization> 
    </system.web> 

而且

<httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    <add name="Access-Control-Allow-Methods" value="GET,PUT,POST,DELETE" /> 
    <add name="Access-Control-Allow-Headers" value="Content-Type" /> 
    </customHeaders> 
</httpProtocol> 

當下面在網上看到建議。

我刪除了這兩個,並開始工作。

我很欣賞這是一個模糊的答案,但它可以幫助我解決一些令人沮喪的日子。

Chris

0

我遇到同樣的問題。我剛更新到Chrome 38(38.0.2125.101米),問題依然存在。如下所示,我在這裏刪除了我的答案並創建了一個新問題:Chrome v37/38 CORS failing (again) with 401 for OPTIONS pre-flight requests

正如您將在這個問題看,我的角應用正在發送一個明確的withCredentials,所以服務器應該認證前投放的OPTIONS請求正確。

+0

您的請求缺少'Authorization'請求標頭。你有沒有設置'xhr.withCredentials = true'?你可以刪除這個「答案」併發佈一個新的問題,其中包含OPTIONS請求和最終響應的請求頭和響應頭? – 2014-10-09 08:42:58

+0

Rob,請看我新添加的問題(上面的鏈接) – 2014-10-10 10:04:01

相關問題