Asp.Net Viewstate超出最大请求长度

时间:2015-07-14 12:11:17

标签: c# asp.net iis-7 viewstate

我遇到了导致我的WebApplication定期崩溃的问题。客户端(浏览器)在向服务器发出一些(超过1个)请求后获取HTTP状态代码500。我打开了IIS失败请求跟踪并发现请求超出了最大请求限制:

Maximum request length exceeded

我查看了隐藏的__VIEWSTATE字段,发现它包含了我预期的一些信息以及一个含有49,500个字符的神秘(可能是base64编码的)序列化对象。我不知道,为什么这么大,在我的代码背后检查我的Session和ViewState目标。但没有什么可疑的。

由于我显示了2个ASP.NET图表和一个大型数据表(5k行和aprox 20 cols),因此我进入了我的Web.Config文件,并将我的请求限制增加到

</system.web>
  <httpRuntime maxRequestLength="4194304"/>    
</system.web>

这有点成功,这意味着服务器还存活了一个请求,然后崩溃了OutOfMemoryException,声称没有更多可用内存。

到目前为止,我非常确定有一些(有些我意味着很多)不需要的,不必要的,很可能未使用的对象存储起来。 (描述内存泄漏的好方法;))。

但在这一点上,我迷失了。有没有什么方法可以在序列化和检查之前查看ViewState,在那里引用了哪种对象?我可以清除/删除/刷新ViewState / Session /对此负责的任何内容,以便拥有一个不超过默认限制的干净的序列化ViewState吗?

2 个答案:

答案 0 :(得分:0)

在服务器端:我们应该编写可以处理响应时间的代码,我们可以遵循以下内容

1.尽量避免使用ViewState:如果您不需要ViewState,请在页面级别禁用View状态。 ViewState

有很多级别的禁用

控制级别:我们可以禁用ViewState以进行特定控制

<asp:TextBox ID="TxtCustomerID" runat="server"  EnableViewState="false" />

页面级别:我们可以禁用整页的查看状态

<%@ Page Title="Customer" Language="C#" EnableViewState="false" %>

目录级别:我们在目录级别禁用视图状态,只需在web.config中的配置标记下添加位置标记,在以下示例中,我将禁用ViewState for Docs目录。

<location path="~/Docs">
     <system.web>
          <pages enableViewState="false"></pages>
     </system.web>
</location>

网站级别:要在网站级别禁用ViewState,请在web.config中的system.web标记下设置页面标记的enableViewState属性为false

<pages enableViewState="false"></pages>

使用自:http://ianswerable.com/asp-net-performance-best-practice/

答案 1 :(得分:0)

终于找到了原因。显然,它还将其内容存储在Viewstate中,这会导致回发请求变得非常大。 (还有一些将数据推送到视图状态的遗留代码)