C# ASP.NET中CORS的问题
我有这个应用程序,我想在Web.Config中设置我的自定义标题,唉,这并不总是万无一失的C# ASP.NET中CORS的问题,c#,asp.net-mvc,asp.net-web-api,cors,http-status-code-405,C#,Asp.net Mvc,Asp.net Web Api,Cors,Http Status Code 405,我有这个应用程序,我想在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>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Methods" value="*" />
<add name="Access-Control-Allow-Headers" value="*" />
</customHeaders>
为什么这里面有这么多含糊不清的地方?我如何确定
CORS
将一直在哪里工作?我对在Web.config
上设置CORS非常感兴趣,因为我希望在部署的版本中能够灵活地修改它。我认为出现您的“随机”问题是因为您没有处理PUT
和Delete
动词的飞行前选项
请求
对于上面提到的两个动词,将生成一个额外的请求,Options
,webapi
需要响应该请求,以确认它确实配置为支持CORS
要处理这个问题,您只需发送一个空响应。您可以在您的操作中执行此操作,也可以像这样全局执行此操作:
protected void Application_BeginRequest()
{
if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
{
Response.Flush();
}
}
添加此额外检查是为了确保设计为仅接受
GET
和POST
请求的旧api
不会被利用。想象一下,向一个API
发送一个DELETE
请求,该API是在这个动词不存在的情况下设计的。结果是不可预测的,结果可能是危险的
另外,在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>
CORS没有歧义,您需要考虑一些案例 1-如果要为Web API启用CORS,请仅使用“Microsoft.AspNet.WebApi.CORS”库 2-如果您想为整个网站(包括Web API、信号器等)启用CORS,请使用“Microsoft.Owin.CORS”库 使用上述2个库肯定会起作用,并且会启用cors,现在如果您想配置url,可以从数据库/config文件中进行配置,因此当应用程序启动url时,您可以从数据库/config文件中传递给EnableCors,但底线是避免在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<PostImportView> Sanity(SanityFilter filter)
{
....
[路由(“健全”)]
[HttpOptions]
[HttpPost]
公共列表健全性(健全过滤器过滤器)
{
....
非常无意义和恼人是的,这似乎是个问题。这个问题似乎是随机的,但从我从你的帖子中读到的,似乎不是。你能解释一下原因吗?这个额外的检查是为了确保配置为只接受GET和post请求的旧API不会被利用。想象一下将删除谓词发送到在该谓词不存在时设计的API。结果不确定,可能会对该API背后的数据造成严重问题。
var cors = new EnableCorsAttribute("*", "*", "GET, POST, PUT, DELETE, OPTIONS");
config.EnableCors(cors);
[Route("sanity")]
[HttpOptions]
[HttpPost]
public List<PostImportView> Sanity(SanityFilter filter)
{
....