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,因为我希望在部署版本中灵活地修改它。
我相信你的’随机’问题是因为你没有处理PUT
和Delete
动词的预检Options
请求 。
对于上面提到的两个动词 ,会生成一个额外的请求 ,即Web API
需要响应的请求 ,以确认它确实配置为支持CORS
。
要处理这个问题,您需要做的就是发送一个空响应 。 您可以在您的操作中执行此操作,也可以像以下一样全局执行此操作:
protected void Application_BeginRequest() { if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS") { Response.Flush(); } }
添加了此额外检查以确保不会利用旨在仅接受GET
和POST
请求的旧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) { ....
非常无意义和烦人