ASP.NET中CORS的问题

Sho*_*vik 5 c# asp.net-mvc cors http-status-code-405 asp.net-web-api

我有这个应用程序,我想在Web.Config中设置我的自定义标题,唉,这并不总是万无一失.

  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="*" />
    <add name="Access-Control-Allow-Headers" value="*" />
  </customHeaders>
Run Code Online (Sandbox Code Playgroud)

上面的设置和它的迭代如

  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Methods" value="OPTIONS,GET,PUT,DELETE,POST" />
    <add name="Access-Control-Allow-Headers" value="Authorization,Content-Type" />
  </customHeaders>
Run Code Online (Sandbox Code Playgroud)

在所有场景中都没有为我工作过.到目前为止,这种设置在大约50%的测试机器中起作用,405 Method Not Allowed在其他测试机器中起作用.

替代方法是在WebApiConfig.cs此处设置并取消注释自定义标头Web.config.

//Web API Cross origin requests - Enable
  var cors = new EnableCorsAttribute("*", "*", "*");
  config.EnableCors(cors);
Run Code Online (Sandbox Code Playgroud)

为什么这里有这么多的含糊不清,我怎么知道哪些地方CORS会一直有效?我真的很感兴趣设置CORS,Web.config因为我希望在部署版本中灵活地修改它.

Mih*_*scu 13

我相信,你的出现"随机"的问题,因为你不处理预检Options 请求PUTDelete 动词.

对于上面提到的两个动词,生成额外的请求Options,Web API需要响应以确认它确实被配置为支持CORS.

要处理这个问题,您需要做的就是发送一个空响应.您可以在您的操作中执行此操作,也可以像以下一样全局执行此操作:

protected void Application_BeginRequest()
{
    if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
    {
        Response.Flush();
    }
}
Run Code Online (Sandbox Code Playgroud)

添加了此额外检查以确保不会被利用的旧APIs的设计为仅接受GETPOST请求.想象一下,当这个动词不存在时,DELETEAPI设计者发送请求.结果是不可预测的,结果可能是危险的.

此外,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" />
  </customHeaders>
 </httpProtocol>
Run Code Online (Sandbox Code Playgroud)