簡體   English   中英

C#WEB API CORS不起作用

[英]C# WEB API CORS does not work

與CORS戰斗。 我有一個網站正在為我在C#中構建的WEB API創建一個簡單的XmlHttpRequest。

    var xhr = new XMLHttpRequest();
    xhr.open("GET","https://server/controller/method", true);
    xhr.send();

在我的web.config中,我完成了以下操作:

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

我還嘗試安裝Nuget包並在我的WebApiConfig.cs中執行以下操作

var cors = new EnableCorsAttribute(
            origins: "*",
            headers: "*",
            methods: "*");
        config.EnableCors(cors);

盡管做了這些努力,CORS仍然無效。 在FireFox控制台中,我收到以下錯誤:

跨源請求已阻止:同源策略不允許在https:// server上讀取遠程資源。 這可以通過將資源移動到同一域或啟用CORS來解決。

IE也只是失敗並且沒有錯誤。

根據我讀過的所有內容,其中一個解決方案應該可以工作,但事實並非如此。 是否需要在客戶端JavaScript中啟用/更改某些內容? 在localhost上運行Visual Studio IIS Express時,CORS不起作用:PortNumber? 我錯過了什么?

在您的客戶端JavaScript代碼中,您可以嘗試添加以下內容:

xhr.withCredentials = true;

正如Firefox CORS請求中所示, 盡管標題為“Cross-Origin Request Blocked”,

否則Firefox在發出請求時無法使用客戶端證書

但是,如果您對客戶端代碼進行了更改,則還需要更改服務器端代碼,以使Access-Control-Allow-Origin值不是* 有幾種方法可以做到這一點......

在IIS配置中,您可以通過將以下內容添加到%SystemDrive%\\inetpub\\wwwroot\\ Web.configApplicationHost.config文件來使用URL重寫模塊執行此操作。

<configuration> 
    <system.webServer> 
        <rewrite> 
            <outboundRules> 
                <rule name="Make Access-Control-Allow-Origin echo Origin"> 
                    <match serverVariable="RESPONSE_Access-Control-Allow-Origin"
                           pattern=".+" negate="true" /> 
                    <action type="Rewrite" value="{HTTP_ORIGIN}" /> 
                </rule> 
            </outboundRules> 
        </rewrite> 
    </system.webServer> 
</configuration>

如果上述方法不起作用,那么您可以在IIS中的CORS中使用憑據和Access-Control-Allow-Origin中的通配符來嘗試該問題的版本。

另一種方法是global.asax或其他服務代碼中添加如下內容

if (ValidateRequest()) {
    Response.Headers.Remove("Access-Control-Allow-Origin");
    Response.AddHeader("Access-Control-Allow-Origin", Request.Headers["origin"]);
    Response.Headers.Remove("Access-Control-Allow-Credentials");
    Response.AddHeader("Access-Control-Allow-Credentials", "true");
    Response.Headers.Remove("Access-Control-Allow-Methods");
    Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");
}

......最重要的部分是:

Response.AddHeader("Access-Control-Allow-Origin", Request.Headers["origin"]);

如果這些都不起作用,請嘗試使用Microsoft.AspNet.WebApi.Cors的方法

你的web.config中需要比現有的更多行:

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

你不能只說“允許一切”,因為默認情況下所有協議都是關閉的,所以必須指定協議,如果你想要對你的請求做任何類型的登錄方法,我會建議Allow-Credentials,否則該行可以刪除。

您還需要確保這一切都包含在system.webServer部分中。

暫無
暫無

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

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