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