我遇到了导致我的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吗?
答案 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)