彻底解决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) { } public void OnActionExecuting(ActionExecutingContext context) { context.HttpContext.Request.Headers.Add("Access-Control-Allow-Headers", "*"); } }
6:注入全局的过滤器
7:查看效果
8:小结
这个问题一直困扰了我好久,之前在网络上找了很多的相关资料都没有解决,今天终于解决了,很开心。
最后(之前的跨域中间件其实也可以去掉了,但是考虑到其他的http和https网站都有调用该项目的接口,先观察一段时间再做进一步打算),
感觉这个中间件是否存在一些bug?不然为啥非要多一次options 204的预检,重复多余的请求会严重影响服务器的性能!牛年大吉大利!欢迎大家留言讨论请教。