徹底解決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的預檢,重復多余的請求會嚴重影響服務器的性能!牛年大吉大利!歡迎大家留言討論請教。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM