【发布时间】:2015-10-03 01:35:30
【问题描述】:
我遇到了一个问题,导致我的 WebApplication 经常崩溃。客户端(浏览器)在向服务器发出一些(超过 1 个)请求后获得 HTTP 状态代码 500。我打开了 IIS Failed Request Tracing,发现请求超过了最大请求限制:
Maximum request length exceeded
我查看了隐藏的 __VIEWSTATE 字段,发现它包含一些我预期的信息和一个包含 49,500 个字符的神秘(可能是 base64 编码)序列化对象。我不知道,为什么它这么大,并在我的代码中检查了我的 Session 和 ViewState 对象。但没有什么可疑的。
由于我要显示 2 个 ASP.NET 图表和一个大型数据表(5k 行和大约 20 列),我进入了我的 Web.Config 文件并将我的请求限制增加到
</system.web>
<httpRuntime maxRequestLength="4194304"/>
</system.web>
这有点成功,这意味着服务器在再次请求之前幸存下来,然后以OutOfMemoryException 崩溃,声称没有更多可用内存。
到目前为止,我很确定存储了一些(我的意思是成吨的)不需要的、不必要的、很可能未使用的对象。 (描述内存泄漏的好方法;))。
但在这一点上,我迷路了。有什么方法可以在 ViewState 被序列化之前查看它并检查那里引用了哪些类型的对象?我可以清除/删除/刷新 ViewState/Session/任何对此负责的人,以便获得不超过默认限制的干净的序列化 ViewState 吗?
【问题讨论】:
-
您的页面有多大?服务器控件的值默认存储在视图状态中(我相信),所以除非你在页面级别或每个单独的控件上禁用视图状态,我可以想象它会增长......但很难相信你的视图状态可以变得那么大。
-
如果不需要视图状态,您是否尝试在 GridView 或 DataTable 上设置 EnableViewState="false"
-
我的页面包含 5 个下拉列表、6 个文本框、3 个单选按钮、一个 ajax 工具包选项卡容器中的 2 个 aps.net 图表和一个在 asp:literal 中呈现的原生 HTML 表格
标签: c# asp.net iis-7 viewstate