.NET Core 5 Web API峰值压测下突发随机CORS错误排查
问题根因分析
你遇到的高负载下CORS错误本质不是CORS配置本身的问题,而是高并发下部分请求根本没有进入.NET Core的中间件处理管道,CORS头没有被注入,才触发了客户端的跨域错误,可以从以下几个方向定位解决:
1. 首先确认请求被IIS提前拦截
你返回的响应头是text/html、content-length:58,符合IIS默认错误响应的特征,500并发下很可能触发了IIS层面的请求队列限制,直接返回了503/超时错误,完全没有走到你写的CORS中间件逻辑:
- 调整IIS应用程序池的队列长度:默认队列长度通常为1000,高并发下请求堆积很快会打满队列,建议调整到4000以上
- 开启IIS失败请求跟踪,确认返回错误的状态码,验证是否是IIS层面直接拦截的请求
- 检查web.config中是否有拦截OPTIONS预检请求的配置,确保OPTIONS动词可以正常传递到.NET Core应用
2. 中间件顺序错误导致CORS校验偶发失败
你当前的UseForwardedHeaders放在了UseEndpoints之后,属于严重的顺序错误:
UseForwardedHeaders必须放在整个中间件管道的最开头,早于UseRouting和UseCors,否则CORS中间件无法正确获取到经代理转发后的Origin请求头,会偶发出现跨域校验失败- 修正后的中间件顺序参考:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { // 第一个就放转发头解析 app.UseForwardedHeaders(new ForwardedHeadersOptions { ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto }); AppDomain.CurrentDomain.SetData("ContentRootPath", env.ContentRootPath); AppDomain.CurrentDomain.SetData("WebRootPath", env.WebRootPath); app.UseRouting(); app.UseCors(corsPolicy); // 放在UseRouting之后,UseAuthorization/UseEndpoints之前 // 其他中间件 if (env.IsDevelopment()) app.UseExceptionHandler("/error-local-development"); else { app.UseExceptionHandler("/error"); app.UseHsts(); } app.UseRequestLocalization(localizeOptions.Value); app.UseEndpoints(endpoints => { endpoints.MapControllers(); endpoints.MapHub<RealTime>("/api/v1/realtime"); }); }
3. 资源瓶颈导致请求超时
- 数据库连接池不足:默认SQL Server连接池最大连接数为100,你500并发每个请求开2~3个数据库连接,峰值需要至少1000个连接,连接池满后请求会阻塞等待连接,触发超时。需要在数据库连接字符串中增加
Max Pool Size=2000配置,放大连接池上限 - 线程池饥饿:高并发下.NET默认线程池扩容速度较慢,会导致请求堆积超时。可以在Program.cs入口处增加最小线程数配置:
ThreadPool.SetMinThreads(workerThreads: 300, completionPortThreads: 300);
4. 额外修正CORS配置的小问题
你当前的跨域白名单中https://test.test.com/末尾多了斜杠,.NET Core的CORS校验是精确匹配的,正式环境如果请求来源不带末尾斜杠会校验失败,建议去掉末尾的斜杠。
内容的提问来源于stack exchange,提问作者Anas Najaa
相关产品推荐
相关产品推荐

