zoukankan      html  css  js  c++  java
  • 彻底解决Asp.netCore WebApi 3.1 跨域时的预检查204 options重复请求的问题

    Asp.netCore WebApi 3.1 跨域的预检查options问题

    1:我们直接使用core跨域的中间件 ,注入跨域服务,

    services.AddCors(options =>
                {
                    // CorsPolicy 是自訂的 Policy 名稱
                    options.AddPolicy("CorsPolicy", policy =>
                    {
                        policy.SetPreflightMaxAge(TimeSpan.FromSeconds(1800L));//update by jason
                        policy.AllowAnyOrigin()
                              .AllowAnyHeader()
                              .AllowAnyMethod();
                    });
                });

    2:在confing里面使用跨域的中间件

       public void Configure(IApplicationBuilder app, IWebHostEnvironment env, TaskListService taskListService)
            {
                //Exceptionless日志
                var isEnableLogger = Convert.ToBoolean(Configuration.GetSection("Exceptionless:Enabled").Value ?? "false");
    
                if (isEnableLogger)
                {
                    // 封装使用Exceptionless分布式日志组件
                    ExceptionlessClient.Default.Configuration.ApiKey = Configuration.GetSection("Exceptionless:ApiKey").Value;
                    // Exceptionless传输地址
                    ExceptionlessClient.Default.Configuration.ServerUrl = Configuration.GetSection("Exceptionless:ServerUrl").Value;
                    ExceptionlessClient.Default.SubmittingEvent += OnSubmittingEvent;
                    app.UseExceptionless();
                }
    
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
                else
                {
                    // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
                }
                app.UseCors("CorsPolicy");
    *****
    }

    3:效果截图:

    4: 后来多加了一行code:   policy.SetPreflightMaxAge(TimeSpan.FromSeconds(1800L)); 

         效果:第一次请求会存在204,下一次相同的url没有发现204的请求,其实就是给缓存了起来,但是不符合预期,

    5:自己手写一个全局的过滤器,问题解决OK,去掉了多余的204预检请求

    public class FEGCrosFilter : IActionFilter
        {
            public void OnActionExecuted(ActionExecutedContext context)
            {
                //简单粗暴
                context.HttpContext.Request.Headers.Add("Access-Control-Allow-Headers", "*");
                context.HttpContext.Request.Headers.Add("Access-Control-Allow-Methods", "*");
                context.HttpContext.Request.Headers.Add("Access-Control-Max-Age", new Microsoft.Extensions.Primitives.StringValues("24*60*60"));
            }
    
            public void OnActionExecuting(ActionExecutingContext context)
            {
    
            }
        }

    6:注入全局的过滤器

    7:查看效果

    8:小结

    这个问题一直困扰了我好久,之前在网络上找了很多的相关资料都没有解决,今天终于解决了,很开心。

    最后(之前的跨域中间件其实也可以去掉了,但是考虑到其他的http和https网站都有调用该项目的接口,先观察一段时间再做进一步打算),

    感觉这个中间件是否存在一些bug?不然为啥非要多一次options 204的预检,重复多余的请求会严重影响服务器的性能!牛年大吉大利!欢迎大家留言讨论请教。

    如有疑问或者错误的地方,请跟帖,本人会第一时间答复以及相互学习,谢谢!个人会不断的上传自己的学习心得!

    我的博客园地址:https://www.cnblogs.com/Fengge518

  • 相关阅读:
    一次难忘的问题定位
    Linux dmidecode 命令
    linux 查看静态库,动态库是32位还是64位
    MTK功能机按键事件时间设置
    linux控制主板蜂鸣器响起
    Linux 下控制蜂鸣器发声的程序
    Android Studio系列-签名打包
    使用git和github进行协同开发流程
    ero-configuration Web Application Debugging with Xdebug and PhpStorm
    sudo: unable to execute ./script.sh: no such file or directory
  • 原文地址:https://www.cnblogs.com/Fengge518/p/14420728.html
Copyright © 2011-2022 走看看