ASP.NET MVC 仅当返回超过25个元素的模型时出现浏览器连接重置错误
对应问题的排查与修复方案
你遇到的阈值现象(刚好25个条目触发连接重置)和之前调整的JSON序列化配置无效,核心原因和普通的响应大小限制并不完全一致,按优先级排查调整即可解决:
核心触发原因定位
- 你返回的是Razor引擎渲染的HTML局部视图,和
maxJsonLength配置完全无关,所以之前调整的system.web.extensions节点配置不生效是正常的。 - 刚好卡在25个条目的触发阈值,对应ASP.NET框架默认的MaxHttpCollectionKeys限制:该参数默认值为100,而你每渲染一个带
Ajax.BeginForm的列表项,就会生成至少4个表单键值(防伪标记、视图状态隐藏域、列表项自身的HiddenFor字段等),25个条目累计的键值数量刚好触碰到100的默认上限,超过阈值后服务器会直接中断TCP响应流,表现为浏览器端的「连接已重置」提示。 - 附加问题:你的列表项局部视图中,静态写死了
<div id="ingredientsListitem">作为容器ID,渲染25个条目后会产生大量重复DOM ID,会进一步加剧视图状态字段的异常累计,提前触发错误。
具体修复调整
- 调整web.config中的框架键值限制,匹配长列表的表单渲染需求:
<configuration> <appSettings> <!-- 放宽HTTP请求键值对上限,默认100的限制刚好在25个嵌套表单时触发 --> <add key="aspnet:MaxHttpCollectionKeys" value="2000" /> <add key="aspnet:MaxJsonDeserializerMembers" value="2000" /> </appSettings> <system.web> <!-- 放宽请求大小、超时限制,覆盖传统经典模式的运行环境 --> <httpRuntime maxRequestLength="102400" executionTimeout="3600" /> </system.web> <system.webServer> <security> <!-- 放宽IIS集成模式下的请求内容长度限制 --> <requestFiltering> <requestLimits maxAllowedContentLength="104857600" /> </requestFiltering> </security> </system.webServer> </configuration> - 修复局部视图的重复ID问题,把列表项的静态容器ID替换为动态值:
// 将原来写死的id="ingredientsListitem" // 替换为动态绑定的唯一id,避免重复DOM触发视图状态校验异常 <div id="@(Model.ContainerDiv + "_RootItem")" class="yui3-g ingredientsListitem"> - 优化表单结构:不要在每个列表项内部嵌套独立的Ajax表单,把Ajax表单提升到列表外层,所有列表项作为表单内部元素,可大幅减少重复的隐藏域标记,降低请求键值累计速度。
临时验证方法:先在全局应用的错误捕获模块(Global.asax的
Application_Error事件)中加入异常日志输出,记录所有未捕获的错误,不需要等连接重置,就能直接看到真实的报错信息,避免盲改配置。
内容的提问来源于stack exchange,提问作者Alberto Montellano
相关产品推荐
相关产品推荐

