C# WEB API CORS 不起作用
Posted
技术标签:
【中文标题】C# WEB API CORS 不起作用【英文标题】:C# WEB API CORS does not work 【发布时间】:2017-07-05 20:48:41 【问题描述】:与 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:PortNumber 上的 Visual Studio IIS Express 中运行 CORS 时,它是否不起作用?我错过了什么?
【问题讨论】:
在常规 http 上运行是否会出现同样的问题? 我正在尝试从 https 站点运行它,当我尝试正常的 http 时,我收到有关混合内容的错误,并且永远不会发出请求。 用邮递员试试吧。 它在 Chrome 中工作......我认为 FireFox 是问题所在。 ***.com/questions/24371734/… 是的,但是问题在于您的 https 证书 【参考方案1】:在您的客户端 JavaScript 代码中,您可以尝试添加以下代码:
xhr.withCredentials = true;
如Firefox CORS request giving 'Cross-Origin Request Blocked' despite headers所示:
否则 Firefox 在发出请求时无法使用客户端证书
但是,如果您对客户端代码进行了更改,您还需要更改服务器端代码,以便 Access-Control-Allow-Origin
的值不是 *
。有几种方法可以做到这一点……
在 IIS 配置中,您可以通过将以下内容添加到 %SystemDrive%\inetpub\wwwroot\
中的 Web.config
或 ApplicationHost.config
文件中来使用 URL Rewrite Module。
<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>
如果上述方法不起作用,那么您可以在CORS in IIS issue with credentials and wildcard in Access-Control-Allow-Origin 上尝试答案中的版本。
另一种方法是,in the global.asax
or other code for your service, add something like this:
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"]);
如果这些都不起作用,请尝试an approach using Microsoft.AspNet.WebApi.Cors
。
【讨论】:
【参考方案2】:您的 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>
您不能只说“允许一切”,因为默认情况下所有协议都是关闭的,因此也必须指定协议,如果您希望对您的请求执行任何类型的登录方法,我建议您允许-凭据,否则可以删除该行。
您还需要确保这些都包含在 system.webServer
部分中。
【讨论】:
感谢bizzehdee,但同样的问题发生了。我已验证它们的设置也包含在 system.webServer 部分中。以上是关于C# WEB API CORS 不起作用的主要内容,如果未能解决你的问题,请参考以下文章
CORS 在 ASP.NET Web API 2 应用程序中不起作用
带有 CORS 和 Angular 的 .NET Web API 2 在第一篇文章中不起作用
在 WebAPI 上启用 CORS 在 Postman 中似乎不起作用