ASP.NET Core 6使用IISExpress上传大文件返回413错误问题排查
问题根因
413错误是IIS Express自身的请求过滤层拦截导致的,和你在ASP.NET Core代码里配置的Kestrel、IISServerOptions、接口特性的限制没有关系。
IIS(包括Express版本)的请求处理是分层的:请求到达后首先经过IIS核心的请求过滤模块校验,校验通过后才会转发给ASP.NET Core模块,进入你写的应用逻辑。你代码里配置的IISServerOptions.MaxRequestBodySize只对ASP.NET Core模块层生效,管不到IIS核心层的校验规则。
IIS Express默认的请求体最大允许长度是30000000字节(约28.6MB),小于你上传的80MB文件,所以请求还没进入应用就被直接拦截返回413。Kestrel自托管模式下不经过IIS层,所有限制都是你代码里配置的120MB,所以上传正常。
修复方法
在项目根目录添加或修改web.config文件,配置IIS核心层的请求长度上限即可,配置值单位为字节,示例配置如下:
<?xml version="1.0" encoding="utf-8"?> <configuration> <system.webServer> <security> <requestFiltering> <!-- 配置为120MB,和代码层的限制保持一致 --> <requestLimits maxAllowedContentLength="120000000" /> </requestFiltering> </security> </system.webServer> </configuration>
配置完成后重启IIS Express即可正常上传80MB文件。
补充注意点
- 这个配置在部署到完整版IIS的生产环境时同样需要保留,否则生产环境IIS也会出现相同的413问题,仅靠代码层配置无法覆盖IIS核心层的限制。
- 大文件上传涉及三层独立限制,必须保证三层的上限都大于实际上传的文件大小:
- IIS/ IIS Express核心层:
web.config中maxAllowedContentLength配置 - Web服务器层:Kestrel的
MaxRequestBodySize或IIS模块的MaxRequestBodySize配置 - 表单层:接口上
[RequestFormLimits]配置的MultipartBodyLengthLimit
- IIS/ IIS Express核心层:
- 不建议直接修改IIS Express全局配置解决问题,会影响本机所有IIS Express启动的站点,用项目级
web.config配置是最稳妥的方案。
内容的提问来源于stack exchange,提问作者Christian
相关产品推荐
相关产品推荐

