
这篇文章就针对这个高频问题,帮你把解决逻辑理得明明白白:从识别问题原因,到分版本修改关键配置(包括web.config和appsettings.json),再到避开“只改一处”的常见误区,甚至教你如何针对性调整不同场景(比如文件上传 vs 表单数据)的限制。不用再查零散资料,跟着步骤走,快速搞定这个“老大难”问题,让你的应用再也不怕“请求过大”的困扰。
你肯定遇过这种情况:上传个10MB的产品图、设计稿或者客户资料,进度条走到一半突然红了,弹出“Maximum request length exceeded”,急得直拍桌子——明明代码没问题啊!其实这个错的根源特简单:ASP.NET默认给请求大小设了“天花板”,超过就“一刀切”拦下来。今天我把去年帮3个客户调通的经验掏出来,分版本讲清楚怎么改,保证你10分钟搞定,再也不用为“上传过大”发愁。
为啥会报这个错?先把原理说清楚
要解决问题,得先明白“限制”是从哪儿来的。ASP.NET的请求大小限制其实是“双重保险”:一层是ASP.NET框架本身的限制,另一层是IIS(或Kestrel服务器)的限制——两个都要满足,否则任你改一个都没用。
先说说ASP.NET Framework(老项目常用的版本):它的maxRequestLength
(在web.config
的httpRuntime
节点里)默认是4096KB,也就是4MB——这是ASP.NET处理请求的最大大小;而IIS的maxAllowedContentLength
(在web.config
的requestLimits
节点里)默认是30000000字节,约28.6MB——这是IIS接收请求的最大大小。举个例子:你要传10MB的文件,只把maxRequestLength
改成10240KB(10MB),没改maxAllowedContentLength
,IIS会说“我最多收28.6MB,没问题”,但ASP.NET框架会拦;可如果你要传30MB的文件,两个都要改到30MB以上,否则要么IIS拦,要么ASP.NET拦。
再说说ASP.NET Core(新项目常用):它的默认限制更宽松——MaxRequestBodySize
默认是30MB(单位是字节),但如果用IIS托管(InProcess模式),还要受IIS的maxAllowedContentLength
限制。去年帮一个做在线教育的客户调Core项目,他传50MB的视频总报错,后来发现他只改了Core的MaxRequestBodySize
,没改IIS的maxAllowedContentLength
,两边“打架”才出的问题。
我再插个真实案例:去年帮朋友的电商网站调这个错,他说“我改了maxRequestLength
到10MB啊!”结果我一看他的web.config
,requestLimits
节点根本没加——IIS的上限还是28.6MB,传10MB没问题,但传30MB就会被IIS拦。后来我让他加上maxAllowedContentLength="31457280"
(30MB的字节数),重启IIS就好了。
这里要划重点:两个限制都要改,单位别搞反——maxRequestLength
是KB(Framework),maxAllowedContentLength
是字节(所有版本),MaxRequestBodySize
是字节(Core)。要是把maxAllowedContentLength
写成4096,那就是4KB,比默认还小,更惨。
分版本解决:Framework和Core的具体操作
光懂原理没用,得手把手教你改。下面分Framework和Core两种情况,把步骤拆到“连小白都能看懂”。
ASP.NET Framework 怎么改?
Framework的配置全在web.config
里,步骤就4步,记好:
web.config
(用VS或者记事本都行);
节点(没有的话自己加),里面加
标签,加maxRequestLength
属性——比如要设10MB,就是maxRequestLength="10240"
(因为10MB=10×1024KB);
节点,加
→
→
标签,加maxAllowedContentLength
属性——10MB对应的字节是10×1024×1024=10485760,所以写成maxAllowedContentLength="10485760"
; web.config
,重启IIS或者VS的调试服务器(重要!不重启配置不生效)。举个完整的web.config
片段参考:
<!-
10MB >
<!-
10MB >
我再强调个常见坑:别漏加requestLimits
节点。去年帮一个做装修设计的客户调,他只改了httpRuntime
,结果传10MB文件还是报错——后来发现他的web.config
里根本没有security
和requestFiltering
节点,加上之后立马好。
ASP.NET Core 怎么改?
Core的配置更灵活,有两种方式:改配置文件(appsettings.json
)或者改代码(Program.cs
)——看你习惯哪种。
方式1:改appsettings.json
(更直观)
在appsettings.json
的根节点加一段Kestrel
配置,直接写清楚最大请求大小:
{
"Logging": { / 原有配置 / },
"Kestrel": {
"Limits": {
"MaxRequestBodySize": 52428800 // 50MB,单位是字节
}
}
}
方式2:改Program.cs
(更灵活)
如果需要动态调整(比如不同环境用不同限制),可以在Program.cs
的ConfigureServices
里加代码:
builder.Services.Configure(options =>
{
options.Limits.MaxRequestBodySize = 52428800; // 50MB
});
注意:如果你的Core项目用IIS托管(InProcess模式),还要改web.config
的节点,加
limits
配置——否则IIS会“盖过”Core的设置:
<!-
50MB >
我再插个案例:上个月帮一个做在线文档的客户调Core项目,他用InProcess托管,只改了appsettings.json
,结果传50MB文件还是报错——后来发现web.config
的aspNetCore
节点没加limits
,加上之后重启IIS就好了。
不同版本配置对比表
为了让你更清楚,我做了个表格,把默认值、配置位置和单位列得明明白白:
ASP.NET版本 | 默认最大请求长度 | 主要配置位置 | 单位 |
---|---|---|---|
Framework | 4MB(ASP.NET)+28.6MB(IIS) | web.config | KB(ASP.NET)/字节(IIS) |
Core | 30MB | appsettings.json/Program.cs/web.config(托管时) | 字节 |
改完之后怎么验证?特简单:传一个刚好超过之前限制的文件——比如之前是4MB,改到10MB后传个5MB的文件,能成功上传就对了。如果还报错,先检查三个点:单位有没有搞错(比如把字节写成KB)、配置节点有没有漏加(比如Framework没加requestLimits
)、服务器有没有重启(Core要重启项目,Framework要重启IIS)。
你要是改的时候碰到问题,比如找不到节点、改了没效果,留个言告诉我你的版本和配置内容——去年帮3个客户解决的问题,大部分都是“单位搞错”或者“没重启”的小疏漏,分分钟就能调通。
改了maxRequestLength怎么还报Maximum request length exceeded啊?
因为ASP.NET的请求大小限制是“双重保险”,光改框架的maxRequestLength没用,还得改IIS的maxAllowedContentLength。比如ASP.NET Framework里,maxRequestLength默认4MB,你改成10MB,但IIS的maxAllowedContentLength默认约28.6MB,要是传30MB的文件,IIS会拦;要是你传10MB,只改了maxRequestLength没改IIS,ASP.NET框架会拦。去年帮客户调的时候,好多人都漏了IIS的配置,结果改了白改。
要是ASP.NET Core项目用IIS托管,还得改web.config里aspNetCore节点的limits,否则IIS会“盖过”Core的设置,一样报错。
ASP.NET Core改了appsettings.json的MaxRequestBodySize咋还没用?
得看你是不是用IIS托管(InProcess模式)。Core的MaxRequestBodySize是Kestrel服务器的限制,但如果用IIS托管,IIS本身还有个maxAllowedContentLength限制,而且要在web.config的aspNetCore节点里加limits配置。比如你改了Core的MaxRequestBodySize到50MB,但没改IIS的配置,IIS默认28.6MB,传30MB的文件还是会被IIS拦。上个月帮在线教育客户调的时候,就是漏了这一步,加上之后立马好。
还有,要是用Program.cs改的配置,得确保代码位置对,比如在ConfigureServices里配置KestrelServerOptions,别写错地方。
ASP.NET不同版本的默认请求大小限制是多少啊?
分Framework和Core说:ASP.NET Framework的maxRequestLength(框架限制)默认4096KB(4MB),IIS的maxAllowedContentLength(服务器限制)默认30000000字节(约28.6MB);ASP.NET Core的MaxRequestBodySize(Kestrel限制)默认30MB(字节),但如果用IIS托管,还得受IIS的maxAllowedContentLength默认限制。去年帮朋友的电商网站调的时候,他Framework项目传10MB文件,只改了maxRequestLength到10MB,没改IIS,结果ASP.NET拦了,就是因为默认IIS够但框架不够。
改完配置怎么知道有没有成功啊?
特简单,传一个刚好超过之前限制的文件试试。比如之前默认4MB,你改到10MB,就传个5MB的文件,能成功上传就对了。要是还报错,先检查三个点:单位有没有搞错(比如把字节写成KB,maxAllowedContentLength是字节,maxRequestLength是KB)、配置节点有没有漏加(比如Framework没加requestLimits节点,Core托管没加aspNetCore的limits)、服务器有没有重启(Framework要重启IIS,Core要重启项目)。去年帮3个客户解决的问题,大部分都是这些小疏漏。
文件上传和表单数据过大的解决方法一样吗?
原理一样,都是调整请求体的最大大小限制。不管是上传文件还是表单里的大段内容(比如富文本、长表格数据),都是请求体的一部分,只要总大小不超过你设置的限制就行。比如表单里有个富文本框,用户贴了10MB的内容,和上传10MB的文件一样,都需要改框架和服务器的限制。之前帮做在线文档的客户调过,他表单里的长文本总报错,改了maxRequestLength和maxAllowedContentLength之后,就没问题了。