2014-03-12 218 views
70

我在客戶端使用AngularJS $ http來訪問服務器端的ASP.NET Web API應用程序的端點。由於客戶端與服務器位於不同的域中,因此我需要CORS。它適用於$ http.post(url,data)。但只要我驗證用戶,並通過$ http.get(URL)的請求,我得到的消息'Access-Control-Allow-Origin'標頭包含多個值

 
The 'Access-Control-Allow-Origin' header contains multiple values 'http://127.0.0.1:9000, http://127.0.0.1:9000', but only one is allowed. Origin 'http://127.0.0.1:9000' is therefore not allowed access. 

提琴手讓我發現,確實有獲取請求兩個頭項後一個成功的選擇請求。什麼和我在哪裏做錯了什麼?

更新

當我使用jQuery $不用彷徨,而不是$ http.get,出現相同的錯誤消息。所以這對於AngularJS來說似乎沒有問題。但是哪裏錯了?

回答

41

我的服務器上添加

config.EnableCors(new EnableCorsAttribute(Properties.Settings.Default.Cors, "", ""))

以及

app.UseCors(CorsOptions.AllowAll);

。這導致兩個標題條目。只需使用後者即可使用。

+2

看起來你正在從設置文件中讀取Properties.Settings.Default.Cors。你能舉一個例子嗎? UseCors是什麼類? – Hoppe

+0

「Uncaught ReferenceError:EnableCorsAttribute is not defined」?? – circuitry

+0

@Hoppe,請查看http://msdn.microsoft.com/en-us/library/dn314597(v=vs.118).aspx。它解釋說,EnableCorsAttribute的第一個參數是允許的起點。例如「*」允許所有。 –

4

Apache服務器:

我花一樣的,但它是因爲我沒有引號(「)在我的文件星號是提供對服務器的訪問,比如‘的.htaccess。’:

Header add Access-Control-Allow-Origin: * 
Header add Access-Control-Allow-Origin "*" 

您也可以有一個文件夾中的文件「的.htaccess'與其他」的.htaccess'出來,如

/ 
- .htaccess 
- public_html/.htaccess (problem here) 

在你的情況,而不是‘*’一sterisk將是您授予數據服務權限的ip(http://127.0.0.1:9000)服務器。

ASP.NET:

檢查沒有「訪問控制允許來源」複製在你的代碼。

開發工具:

有了Chrome,你可以驗證你的請求頭。按F12鍵並轉到「網絡」選項卡,現在運行AJAX請求並出現在列表中,單擊並提供所有信息。

Access-Control-Allow-Origin: *

+0

有時它的那麼簡單...當試圖讓這些混淆的Web服務在IIS/Chrome上運行時,我使用了Application_BeginRequest方法,並忘記了它...在我自己的代碼中重複!謝謝你指出我明顯! :) –

+1

要獲得CORS響應標題,您還必須模擬實際的跨源請求,因此如果您僅查看運行網站上的網絡選項卡,它可能不會顯示。但是,使用DHC(https://chrome.google.com/webstore/detail/dhc-resthttp-api-client/aejoelaoggembcahagimdiliamlcdmfm?hl=en)來運行您的AJAX請求在技術上會從不同的域調用,從而觸發CORS並允許您查看訪問控制標題。 –

29

我使用一個Cors 5.1.0.0,大爲頭痛後,我發現這個問題被複制 訪問控制允許來源從服務器

&訪問控制允許,頭頭

從WebApiConfig中刪除config.EnableCors()。cs文件,只需在控制器類別上設置[EnableCors("*","*","*")]屬性

檢查this article瞭解更多詳情。

4

其實你不能設置多個標頭Access-Control-Allow-Origin(或者至少它不能在所有的瀏覽器中工作)。相反,您可以有條件地設置的環境變量,然後用它在Header指令:

SetEnvIf Origin "^(https?://localhost|https://[a-z]+\.my\.base\.domain)$" ORIGIN_SUB_DOMAIN=$1 
Header set Access-Control-Allow-Origin: "%{ORIGIN_SUB_DOMAIN}e" env=ORIGIN_SUB_DOMAIN 

所以在這個例子中,響應頭將只有一個請求頭Origin匹配被添加正則表達式:^(https?://localhost|https://[a-z]+\.my\.base\.domain)$(它基本上意味着本地主機通過HTTP或通過HTTPS的HTTPS和* .my.base.domain)。

請記住啓用setenvif模塊。

文檔:

BTW。 %{ORIGIN_SUB_DOMAIN}e中的}e不是拼寫錯誤。這就是你如何使用Header指令中的環境變量。

+1

你有沒有設置多個訪問控制標題的來源?我找不到任何證實這一點的事情。 – Spencer

+0

非常聰明,乾淨的解決方案。爲我工作。 –

+0

@Spencer「注意:實際上,origin-list-or-null的生產更受限制,而不是允許以空格分隔的原始列表,它是*單個來源或字符串」null「*。 http://www.w3.org/TR/cors/#access-control-allow-origin-response-header – Nux

1

剛剛有一個nodejs服務器的這個問題。

這裏是我如何修復它。
我運行我的節點服務器通過nginx proxy,我設置nginx和nodeallow cross domain requests,它不是那樣,所以我從nginx中刪除它,並將它留在節點中,一切都很好。

+0

謝謝你的回答!它解決了我用nginx + Rack(Ruby)安裝很長時間無法解決的問題。同樣的問題,相同的解決方案:關閉nginx中的頭添加,並讓'rack-cors' gem處理CORS的東西。巴姆,固定。 – Pistos

31

我們遇到了這個問題,因爲我們已經根據最佳實踐設置了CORS(例如http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api),並且在web.config中還有一個自定義標頭<add name="Access-Control-Allow-Origin" value="*"/>

刪除web.config項,一切正常。

與@ mww的回答相反,我們在控制器上的WebApiConfig.cs AND EnableCorsAttribute中仍然有EnableCors()。當我們拿出一個或另一個時,我們遇到了其他問題。

+7

我刪除了這一行並且我沒有刪除web.config文件中的其他兩個條目:

+0

那是我的問題..謝謝 – lawphotog

+1

這是關鍵,你必須只啓用CORS一次,我的問題是,我也有它啓用在我的web.config以及app.UseCors()...我刪除了web.config條目,只是使用了app.UseCors(Microsoft.Owin.Cors.CorsOptions.AllowAll);方法。 –

6

我也有OWIN以及我的WebAPI,它們都明顯需要單獨啓用CORS,從而創建'Access-Control-Allow-Origin' header contains multiple values錯誤。

我結束了全部移除代碼啓用CORS,然後添加以下到system.webServer節點我的web.config中:

<httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="https://stethio.azurewebsites.net" /> 
    <add name="Access-Control-Allow-Methods" value="GET, POST, OPTIONS, PUT, DELETE" /> 
    <add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, Authorization" /> 
    </customHeaders> 
</httpProtocol> 

做着OWIN這個滿意CORS的要求(允許登錄)和的WebAPI (允許API調用),但是它創建了一個新問題:在我的API調用的預檢期間找不到OPTIONS方法。對於此修復程序很簡單 - 我只需要刪除從handlers節點我的web.config以下:

<remove name="OPTIONSVerbHandler" /> 

希望這可以幫助別人。

4

當您在多個位置配置Cors選項時會發生這種情況。在我的情況下,我在控制器級別以及Startup.Auth.cs/ConfigureAuth中都有。

我的理解是,如果你想讓它應用廣泛然後只將其配置在Startup.Auth.cs/ConfigureAuth這樣......你需要參考Microsoft.Owin.Cors

public void ConfigureAuth(IAppBuilder app) 
     { 
      app.UseCors(CorsOptions.AllowAll); 

如果你比較將其保存在控制器級別,然後您可以插入控制器級別。

[EnableCors("http://localhost:24589", "*", "*")] 
    public class ProductsController : ApiController 
    { 
     ProductRepository _prodRepo; 
+0

在我的情況下,我把它設置在Web.Config和MyAppApiConfig.cs中。從後者中刪除它解決了我的問題。 –

1

,如果你在IIS,你需要激活CORS在web.config中,那麼你不需要在App_Start/WebApiConfig.cs註冊方法,使

我的解決辦法,在這裏評論的線:

// Enable CORS 
//EnableCorsAttribute cors = new EnableCorsAttribute("*", "*", "*"); 
//config.EnableCors(cors); 

,並在web.config中寫:

<system.webServer> 
    <httpProtocol> 
    <customHeaders> 
    <add name="Access-Control-Allow-Origin" value="*" /> 
    </customHeaders> 
</httpProtocol>