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 请求对PUT和Delete 动词.
对于上面提到的两个动词,生成额外的请求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的设计为仅接受GET和POST请求.想象一下,当这个动词不存在时,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>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6285 次 |
| 最近记录: |