所有分类
  • 所有分类
  • 游戏源码
  • 网站源码
  • 单机游戏
  • 游戏素材
  • 搭建教程
  • 精品工具

ASP.NET Web应用程序报Maximum request length exceeded?快速搞定上传/请求过大问题

ASP.NET Web应用程序报Maximum request length exceeded?快速搞定上传/请求过大问题 一

文章目录CloseOpen

这篇文章就针对这个高频问题,帮你把解决逻辑理得明明白白:从识别问题原因,到分版本修改关键配置(包括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.confighttpRuntime节点里)默认是4096KB,也就是4MB——这是ASP.NET处理请求的最大大小;而IIS的maxAllowedContentLength(在web.configrequestLimits节点里)默认是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.configrequestLimits节点根本没加——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或者记事本都行);
  • 改ASP.NET的限制:找到节点(没有的话自己加),里面加标签,加maxRequestLength属性——比如要设10MB,就是maxRequestLength="10240"(因为10MB=10×1024KB);
  • 改IIS的限制:找到节点,加标签,加maxAllowedContentLength属性——10MB对应的字节是10×1024×1024=10485760,所以写成maxAllowedContentLength="10485760"
  • 重启生效:保存web.config,重启IIS或者VS的调试服务器(重要!不重启配置不生效)。
  • 举个完整的web.config片段参考:

    
    

    <!-

  • 10MB >
  • <!-

  • 10MB >
  • 我再强调个常见坑:别漏加requestLimits节点。去年帮一个做装修设计的客户调,他只改了httpRuntime,结果传10MB文件还是报错——后来发现他的web.config里根本没有securityrequestFiltering节点,加上之后立马好。

    ASP.NET Core 怎么改?

    Core的配置更灵活,有两种方式:改配置文件(appsettings.json)或者改代码(Program.cs)——看你习惯哪种。

    方式1:改appsettings.json(更直观)

    appsettings.json的根节点加一段Kestrel配置,直接写清楚最大请求大小:

    {
    

    "Logging": { / 原有配置 / },

    "Kestrel": {

    "Limits": {

    "MaxRequestBodySize": 52428800 // 50MB,单位是字节

    }

    }

    }

    方式2:改Program.cs(更灵活)

    如果需要动态调整(比如不同环境用不同限制),可以在Program.csConfigureServices里加代码:

    builder.Services.Configure(options =>
    

    {

    options.Limits.MaxRequestBodySize = 52428800; // 50MB

    });

    注意:如果你的Core项目用IIS托管(InProcess模式),还要改web.config节点,加limits配置——否则IIS会“盖过”Core的设置:

    
    

    <!-

  • 50MB >
  • 我再插个案例:上个月帮一个做在线文档的客户调Core项目,他用InProcess托管,只改了appsettings.json,结果传50MB文件还是报错——后来发现web.configaspNetCore节点没加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之后,就没问题了。

    原文链接:https://www.mayiym.com/49181.html,转载请注明出处。
    0
    显示验证码
    没有账号?注册  忘记密码?

    社交账号快速登录

    微信扫一扫关注
    如已关注,请回复“登录”二字获取验证码