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.configApplicationHost.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 在 web api2 项目中不起作用

CORS 在 ASP.NET Web API 2 应用程序中不起作用

带有 CORS 和 Angular 的 .NET Web API 2 在第一篇文章中不起作用

在 WebAPI 上启用 CORS 在 Postman 中似乎不起作用

Swagger 在 OWIN Startup Web API C# 中不起作用

通过 C# 或 jQuery ajax 调用时,Web API 不起作用