ASP.NET中CORS的问题

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

     

上面的设置和它的迭代如

       

在所有场景中都没有为我工作过。 截至目前,此设置适用于大约50%的测试机器,并且在其他测试机器中提供405 Method Not Allowed

替代方法在WebApiConfig.cs设置,并取消注释Web.config的自定义标头。

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

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

我相信你的’随机’问题是因为你没有处理PUTDelete 动词的预检Options 请求

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

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

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

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

另外,在web.config ,您应该指定方法而不是使用*

        

CORS没有任何含糊之处,您需要考虑一些案例

1-如果要为Web API启用CORS,请仅使用“Microsoft.AspNet.WebApi.Cors”库。

2-如果要为整个网站(包括Web API,SignalR,..等)启用CORS,请使用“Microsoft.Owin.Cors”库。

使用上面2中的任何库肯定会工作,并且将启用cors,现在如果你想配置url,你可以从你的数据库/配置文件中做到这一点,所以当你的应用程序启动你传递给EnableCors的url时示例可以来自数据库/配置文件,但最重要的是避免向web.config添加任何cors头。

要知道如何为您的Web API启用CORS,您可以查看我的文章,它为Web API启用CORS并从AngularJS客户端使用它。

希望有所帮助。

对于读这篇文章的人来说,这可能有所帮

即使使用以下启动代码

 var cors = new EnableCorsAttribute("*", "*", "GET, POST, PUT, DELETE, OPTIONS"); config.EnableCors(cors); 

我不得不将动词添加到Web Api动作方法中:

 [Route("sanity")] [HttpOptions] [HttpPost] public List Sanity(SanityFilter filter) { .... 

非常无意义和烦人