技术初心程序园

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、有些问题并不总出现

一直用得好好的东西,某天,突然有人反馈用不了,这可能只是代表某些场景之前未曾碰到,遇到一种补充一种,让跨域跨越来越能跨。

上一篇下一篇

猜你喜欢

热点阅读