IIS部署.NET Core应用出现400 Bad Request Header too long错误如何解决
解决方案
1. 修正web.config完整配置
IIS托管.NET Core应用时,除了常规的请求限制,还要额外配置ASP.NET Core模块(ANCM)的头大小限制,完整配置示例如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <!-- 配置IIS运行时允许更大的请求头 --> <serverRuntime maxRequestHeaders="16384" enabled="true" /> <security> <requestFiltering> <requestLimits maxAllowedContentLength="1073741824"> <!-- 单独配置Authorization头的最大允许大小,单位字节 --> <headerLimits> <add header="Authorization" sizeLimit="1048576" /> </headerLimits> </requestLimits> </requestFiltering> </security> <!-- 配置ANCM的最大请求头总大小为1MB,单位字节 --> <aspNetCore processPath="dotnet" arguments=".\你的应用名称.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess"> <handlerSettings> <handlerSetting name="maxRequestHeadersSize" value="1048576" /> </handlerSettings> </aspNetCore> </system.webServer> </configuration>
注意:如果添加
2. 确保注册表配置生效
你修改的HKEY_LOCAL_MACHINE/System/CurrentControlSet/Services/HTTP/Parameters路径下的MaxFieldLength(建议设为65534,单位字节)和MaxRequestBytes(建议设为16777216,单位字节)参数,修改后必须重启HTTP服务才会生效,操作步骤:
- 打开管理员权限的命令提示符
- 执行
net stop http /y停止HTTP服务,依赖的IIS相关服务会同步停止 - 执行
net start w3svc重启IIS服务 - 条件允许的话重启服务器可以确保配置完全加载
3. 托管模式适配
- 如果用的是进程内托管模式,完成前两步配置即可生效,不需要额外修改Kestrel配置
- 如果用的是进程外托管模式,需要保留你之前写的Kestrel头大小限制代码,两边的限制都要放开才会生效
4. 根源优化方案
正常情况下授权令牌不会随着API调用次数增加而持续膨胀,出现这个问题大概率是授权逻辑每次鉴权都往Claims里追加内容没有清理,或者把大量非必要信息存到了JWT令牌中,可以从根源优化避免后续再出现同类问题:
- 梳理授权逻辑,仅在令牌中保留必要的用户标识信息,不要冗余存储
- 大权限场景下可以改用参考令牌,令牌仅存储唯一标识,用户权限信息存在服务端缓存/数据库中,鉴权时再读取,彻底避免请求头过大问题
内容的提问来源于stack exchange,提问作者Pravin Jaiswal
相关产品推荐
相关产品推荐

