You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.NET Core在IIS中配置MaxRequestBodySize仍遇告警问题咨询

解决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.websystem.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 transformationXML variable substitution功能(除非你明确需要),避免这些功能修改你的限制值。

3. 反向代理站点的配置遗漏

作为反向代理的IIS站点,除了maxAllowedContentLengthmaxRequestEntityAllowed,还要确认两个关键点:

  • ARR缓冲设置:如果启用了Application Request Routing(ARR),需要检查ARR的proxyBufferLimit和请求缓冲配置,确保反向代理不会截断大请求。
  • 请求头部传递:在反向代理的<rewrite>规则中,要确保允许传递CONTENT_LENGTH等关键头部。可以在allowedServerVariables中添加CONTENT_LENGTH,避免头部丢失导致ASP.NET Core读取错误的长度值。

4. 应用池的32位模式限制

如果你的应用池设置为“启用32位应用程序”,虽然你设置的4294967295是32位无符号最大值,但某些IIS内部处理逻辑可能会出现溢出或读取异常。建议将应用池的“启用32位应用程序”设置为False,排除这个潜在问题。

最后验证步骤

  1. 发布后直接登录服务器,打开站点根目录的Web.config,确认你的限制配置项存在且值正确。
  2. 检查反向代理站点的ApplicationHost.configWeb.config,确保配置和后端站点一致。
  3. 运行调试代码,确认ASP.NET Core读取到的maxAllowedContentLength4294967295

内容的提问来源于stack exchange,提问作者cmeeren

火山引擎 最新活动