.NET Core服务调用API报HTTP Error 400:请求头过长求助
问题分析与解决方案
问题概述
3个.NET 6控制台服务每30秒调用.NET Core 3.1 API控制器,运行一段时间后触发HTTP Error 400. The size of the request headers is too long错误,但日志显示请求仅包含Content-Type头,且配置Kestrel请求头大小限制后无效果。
可能原因与解决步骤
1. IIS托管场景:优先修改IIS请求限制
若API部署在IIS上,Kestrel的配置会被IIS的反向代理拦截,需直接调整IIS的请求头限制:
- 在项目
web.config中添加/修改节点:
<system.webServer> <security> <requestFiltering> <!-- 设置请求头总大小为1MB --> <requestLimits maxRequestHeadersTotalSize="1048576" /> </requestFiltering> </security> </system.webServer>
- 若需服务器级全局配置,修改
C:\Windows\System32\inetsrv\config\applicationHost.config中对应站点的上述节点。
2. HttpClient自动Cookie累积
.NET的HttpClient默认自动管理Cookie容器,若服务端每次请求返回新的Set-Cookie,多次请求后Cookie会在请求头中累积膨胀。可通过两种方式解决:
- 禁用自动Cookie管理:
var handler = new HttpClientHandler { UseCookies = false }; var httpClient = new HttpClient(handler);
- 每次请求前清空Cookie容器:
// 若复用HttpClientHandler,每次请求前重置Cookie容器 handler.CookieContainer = new CookieContainer();
3. 反向代理(Nginx/Apache)的限制
若API前端有反向代理,需调整代理的请求头大小配置:
- Nginx:在站点配置或
nginx.conf中添加:
client_header_buffer_size 16k; large_client_header_buffers 4 16k;
- Apache:在
httpd.conf或.htaccess中添加:
LimitRequestFields 100 LimitRequestFieldSize 8192
4. 确保Kestrel配置正确生效
在.NET Core 3.1中,需确认Kestrel配置未被覆盖,可直接在Program.cs中配置:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseKestrel(options => { options.Limits.MaxRequestHeadersTotalSize = 1024 * 1024; // 1MB }); webBuilder.UseStartup<Startup>(); });
额外排查建议
开启更详细的请求头日志,确认实际发送的请求内容:
- 客户端打印
HttpClient.DefaultRequestHeaders的所有项; - API端添加中间件捕获完整请求头:
app.Use(async (context, next) => { foreach (var header in context.Request.Headers) { Console.WriteLine($"{header.Key}: {header.Value}"); } await next(); });
内容的提问来源于stack exchange,提问作者Hickori
相关产品推荐
相关产品推荐

