徹底解決Asp.netCore WebApi 3.1 跨域時的預檢查204 options重複請求的問題

jason發表於2021-02-20

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的預檢,重複多餘的請求會嚴重影響伺服器的效能!牛年大吉大利!歡迎大家留言討論請教。

 

相關文章