ASP.NET 跨域问题

作者: triplestudio | 来源:发表于2020-02-23 22:09 被阅读0次

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

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

    相关文章

      网友评论

        本文标题:ASP.NET 跨域问题

        本文链接:https://www.haomeiwen.com/subject/lkslqhtx.html