ASP.NET Core在IIS中配置MaxRequestBodySize仍遇告警问题咨询
我明白你现在的困扰——明明已经把IIS相关的各种上传限制都拉满了,代码里设置IHttpMaxRequestBodySizeFeature.MaxRequestBodySize的时候还是会弹出那个烦人的告警,哪怕实际上传已经能突破默认限制了。让我们一步步排查可能的问题点:
1. 先确认ASP.NET Core实际读取到的IIS配置值
那个告警的触发逻辑很明确:ASP.NET Core启动时会读取IIS的maxAllowedContentLength值,只要你设置的MaxRequestBodySize大于这个读取到的值,就会触发告警。所以第一步要搞清楚:ASP.NET Core到底读到了什么值?
你可以在代码里加一段调试逻辑,在设置MaxRequestBodySize之前,输出当前从IIS获取到的限制值:
// 在你的API操作方法或中间件中添加 var iisServerVars = HttpContext.Features.Get<IISServerVariablesFeature>(); if (iisServerVars != null) { var maxAllowedContentLength = iisServerVars["MAX_ALLOWED_CONTENT_LENGTH"]; // 可以写入日志或者临时返回这个值 Console.WriteLine($"IIS reported maxAllowedContentLength: {maxAllowedContentLength}"); }
如果输出的值不是你设置的4294967295,那说明ASP.NET Core根本没读到你配置的最大值,问题出在配置加载环节。
2. 排查配置加载的优先级与发布覆盖问题
IIS的配置加载是有层级顺序的,而且Azure Pipelines发布过程可能会悄悄覆盖你的配置:
- 配置层级优先级:服务器级
ApplicationHost.config> 站点根Web.config> 应用子目录Web.config。如果你的站点子目录里还有额外的Web.config,可能会覆盖根目录的配置。 - 发布时的配置替换:ASP.NET Core发布到IIS时,默认会自动生成包含
<aspNetCore>模块配置的Web.config。如果你仓库里原本没有Web.config,后来添加的配置里缺少这个节点,发布时Web Deploy会直接替换成默认生成的版本,导致你加的system.web和system.webServer配置丢失。
解决办法是:在项目中添加完整的Web.config,包含ASP.NET Core模块配置,示例如下:
<configuration> <system.web> <httpRuntime maxRequestLength="2147483647" /> </system.web> <system.webServer> <security> <requestFiltering> <requestLimits maxAllowedContentLength="4294967295" /> </requestFiltering> </security> <!-- 必须保留这个节点,否则发布时会被替换 --> <aspNetCore processPath="dotnet" arguments=".\YourApi.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" /> </system.webServer> </configuration>
同时检查Azure Pipelines的发布任务,确保没有开启XML transformation或XML variable substitution功能(除非你明确需要),避免这些功能修改你的限制值。
3. 反向代理站点的配置遗漏
作为反向代理的IIS站点,除了maxAllowedContentLength和maxRequestEntityAllowed,还要确认两个关键点:
- ARR缓冲设置:如果启用了Application Request Routing(ARR),需要检查ARR的
proxyBufferLimit和请求缓冲配置,确保反向代理不会截断大请求。 - 请求头部传递:在反向代理的
<rewrite>规则中,要确保允许传递CONTENT_LENGTH等关键头部。可以在allowedServerVariables中添加CONTENT_LENGTH,避免头部丢失导致ASP.NET Core读取错误的长度值。
4. 应用池的32位模式限制
如果你的应用池设置为“启用32位应用程序”,虽然你设置的4294967295是32位无符号最大值,但某些IIS内部处理逻辑可能会出现溢出或读取异常。建议将应用池的“启用32位应用程序”设置为False,排除这个潜在问题。
最后验证步骤
- 发布后直接登录服务器,打开站点根目录的
Web.config,确认你的限制配置项存在且值正确。 - 检查反向代理站点的
ApplicationHost.config和Web.config,确保配置和后端站点一致。 - 运行调试代码,确认ASP.NET Core读取到的
maxAllowedContentLength是4294967295。
内容的提问来源于stack exchange,提问作者cmeeren




