IIS asp.net webservice 如何上传超大文件或内容,由于默认的大小才4M左右,明显不够用的,需要在web.config中进行自定义大小。
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<!-- 100MB,超时10分钟 -->
<httpRuntime maxRequestLength="102400" executionTimeout="600" />
<customErrors mode="Off"></customErrors>
</system.web>
<system.webServer>
<security>
<requestFiltering>
<!-- 100MB 字节 -->
<requestLimits maxAllowedContentLength="104857600" />
</requestFiltering>
</security>
</system.webServer>
</configuration>
# 核心一句话
`` 是 **[ASP.NET](https://ASP.NET) 运行时限制**(.NET Framework);
`` 是 **IIS 内核级限制**。
**两个是独立关卡,必须同时配置,取较小值生效**。
>
> 单位不一样!这点很多人踩坑:
>
>
> - `maxRequestLength`:**KB**
> - `maxAllowedContentLength`:**Bytes(字节)**
> 你当前配置:
> - `maxRequestLength="102400"` → 102400 KB = 104,857,600 Byte(100MB)
> - `maxAllowedContentLength="104857600"` → 正好也是 100MB,两者匹配。
## 1、
- 归属:`system.web`,**[ASP.NET](https://ASP.NET) 托管引擎**
- 作用:请求进入[ASP.NET](https://ASP.NET)管道之后,才会校验大小。
- 适用:经典模式 + 集成模式都生效。
- 限制对象:托管代码层面,超过这个值,[ASP.NET](https://ASP.NET) 抛出 `HttpException`。
- ⚠️ IIS 集成模式下,**IIS 内核会先拦截**,如果 IIS 限制更小,[ASP.NET](https://ASP.NET)根本接收不到请求,直接返回 413。
## 2、
- 归属:`system.webServer/security/requestFiltering`,**IIS 原生模块(requestFiltering)**
- 作用:在内核层面就检查请求体大小,**请求还没进入[ASP.NET](https://ASP.NET)托管管道就拦截**。
- 仅 IIS7+ 集成模式使用(现在 IIS 默认都是集成模式)。
- 超过直接返回:`413 Request Entity Too Large`,不会进.NET 代码。
# 为什么两处都要写?
1、**两道关卡,先过 IIS,再过[ASP.NET](https://ASP.NET)**
请求流程:
客户端 → IIS 内核(requestFiltering)→ [ASP.NET](https://ASP.NET)管道(httpRuntime)
只要任意一个上限更小,就会被拦截。
举例子:
只改了 `maxRequestLength="102400"`,但 IIS 默认`maxAllowedContentLength`很小(默认约 30MB)。
上传 > 30MB 文件,**直接被 IIS 拦截返回 413,[ASP.NET](https://ASP.NET)代码根本不会执行**。
反过来,只改 IIS 的`maxAllowedContentLength`,`maxRequestLength`保持默认 4MB,上传 50MB:IIS 放行,进入[ASP.NET](https://ASP.NET),被.NET 抛出异常。
>
> 所以生产环境一般**两者数值对齐**,避免迷惑。
## 额外:executionTimeout="600"
也是`system.web/httpRuntime`下面的,**[ASP.NET](https://ASP.NET)托管执行超时**(单位:秒),不是 IIS 超时。
- executionTimeout:托管代码执行超时,请求进[ASP.NET](https://ASP.NET)之后开始计时。
- IIS 还有自己的`connectionTimeout`(连接超时),在站点高级设置,别搞混。
## 你的 web.config 小优化建议
```
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<system.web>
<!-- 100MB,单位KB;超时10分钟 -->
<httpRuntime maxRequestLength="102400" executionTimeout="600" />
<customErrors mode="Off"></customErrors>
</system.web>
<system.webServer>
<security>
<requestFiltering>
<!-- 100MB,单位字节 -->
<requestLimits maxAllowedContentLength="104857600" />
</requestFiltering>
</security>
</system.webServer>
</configuration>
```
### 补充坑点
1. 上传大文件,除了大小限制,还要留意**IIS 的 uploadReadAheadSize**,超大文件场景偶尔会遇到;
2. `customErrors mode="Off"` 只对[ASP.NET](https://ASP.NET)错误有效,IIS 原生 413 这类错误不受这个控制;
3. 如果是 WebForms / WebAPI 项目,这套配置适用 .NET Framework;.NET Core/.NET5+ 完全不一样,没有 httpRuntime 这一套。