[英]CORS Issue: C# API requests work for one domain, but not to the other
[英]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.config
或ApplicationHost.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.