ASP.NET 跨域问题
2020-02-23 本文已影响0人
triplestudio
1、问题所在
由于服务端,客户端的策略都可能影响跨域访问,充满不确定性。
(1)客户端会发 OPTIONS 预读
(2)服务端(如WEB API服务端)默认阻止 OPTIONS 请求
(3)value="*" 可能会视为无效,如 Allow-Credentials=true 时,Allow-Origin 可能使用 * 就无效了。或都 Allow-Headers 为 * 时可能无效等
2、ASP.NET 在使用 WEB API 时的问题
(1)OPTIONS 405 错误
(2)Content-Type Not Allowed
(3)HTTP not ok status
等等......
3、解决
(1)Allow-Headers 不使用 *,逐个列出来
(2)Access-Control-Allow-Credentials 设置为 false,设置为 true 则 Access-Control-Allow-Origin 为 * 可能存在某些场景的问题。
(3)监听 OPTIONS 请求,直接返回 Status 200
以下为 Web.config 中 system.webServer
中的配置:
<httpProtocol>
<customHeaders>
<add name="Access-Control-Allow-Origin" value="*" />
<add name="Access-Control-Allow-Headers" value="Origin, X-Requested-With, Content-Type, Accept, WG-App-Version, WG-Device-Id, WG-Network-Type, WG-Vendor, WG-OS-Type, WG-OS-Version, WG-Device-Model, WG-CPU, WG-Sid, WG-App-Id, WG-Token, token" />
<add name="Access-Control-Allow-Methods" value="POST, GET, OPTIONS, PUT, DELETE" />
<add name="Access-Control-Allow-Credentials" value="false" />
</customHeaders>
</httpProtocol>
在 system.webServer
增加 module
<modules>
<add name="exampleModule" type="MethodModule"/>
</modules>
在 module 中实现对 OPTIONS 请求的处理:
public class MethodModule : IHttpModule
{
public MethodModule() { }
public void Init(HttpApplication app)
{
app.BeginRequest += new EventHandler(this.OptionsRequest);
}
public void Dispose() { }
public void OptionsRequest(object source, EventArgs e)
{
HttpApplication app = source as HttpApplication;
if (app.Context.Request.HttpMethod.ToUpper() == "OPTIONS")
{
app.Context.Response.StatusCode = 200;
app.Context.Response.End();
}
}
}
4、有些问题并不总出现
一直用得好好的东西,某天,突然有人反馈用不了,这可能只是代表某些场景之前未曾碰到,遇到一种补充一种,让跨域跨越来越能跨。