【问题标题】:Asp.Net Viewstate exceeds max request lengthAsp.Net Viewstate 超过最大请求长度
【发布时间】: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


【解决方案1】:

终于找到原因了。显然 an 还将其内容存储在 ViewState 中,这导致 PostBack 请求非常大。 (还有一些将数据推送到 ViewState 的遗留代码)

【讨论】:

    【解决方案2】:

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

    1.尽量避免 ViewState :如果您不需要 ViewState 则禁用页面级别的视图状态。 ViewState 有很多级别的禁用

    控制级别:我们可以禁用特定控件的 ViewState

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

    页面级别:我们可以禁用整个页面的视图状态

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

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

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

    网站级别:为了在网站级别禁用 ViewState,将 web.config 中 system.web 标签下 pages 标签的 enableViewState 属性设置为 false

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

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

    【讨论】:

    • 但是(我认为)我需要 Viewstate。我有几个 DropDownLists 依赖于另一个。因此,我将它们中的每一个都放在了 UpdatePanel 中以更改值。
    • 现在试试这个看看是否是问题所在。是数据太大还是问题出在其他地方。
    • 你可以试试这个网站会帮助你捕捉到异常stackoverflow.com/questions/665453/…
    • 我已经覆盖了 OnError ,即实现了 Application_Error 并在其中放置了一些断点。但它们没有被触发
    • 好吧,我的最后一件事:stackoverflow.com/questions/3853767/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 2015-11-02
    相关资源
    最近更新 更多