UpdatePanel PostBack截断HTTP正文

时间:2012-10-01 20:10:44

标签: asp.net webforms asp.net-ajax

当更新面板中的回发发生得太快时,似乎ASP.NET客户端JavaScript有一个错误,即它发送到服务器的主体不等于HTTP头中的内容长度。这会导致IIS 7.5在视图状态变量被截断时抛出“无效的base-64”异常(对于我的特定应用程序)。 Fiddler跟踪显示HTTP请求实际上是格式错误。

在我的生产案例中(它发生在多个页面上),这是由于非常大的视图状态。是的,我可以修剪它或完全摆脱它。但问题是有没有人知道为什么客户端截断正文以及如何避免它?

鉴于我没有添加任何自己的JavaScript,在我看来,错误在于MS客户端JavaScript。请注意,我只在IE8 / 9和Chrome而不是Firefox中触发它 - 也许Firefox使用不同的套接字库(nspr仍然)?

以下是我设计用来说明问题的一个例子。我在“网站”中添加了页面,并使用VS10和.Net 4.我可以使用IIS7.5和VS10内置Web服务器触发问题。此示例通常截断为64k(完全)但我的生产页面有所不同。

在Default.aspx中:

<asp:UpdatePanel ID="up" runat="server" UpdateMode="Conditional"> 
  <ContentTemplate> 

     <asp:Label ID="lblResult" runat="server" /> 

     <asp:Repeater ID="rptCheckBoxes" runat="server"> 
        <ItemTemplate> 
         <br /> 
         <asp:CheckBox ID="cbOne" runat="server" 
                       AutoPostBack="true" 
                       OnCheckedChanged="cb_OnCheckChanged" 
                       Text='<%# Eval("thing") %>' /> 
        </ItemTemplate> 
     </asp:Repeater> 

  </ContentTemplate> 
</asp:UpdatePanel>

在Default.aspx.cs中:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!Page.IsPostBack) 
    { 
        var things = new List<Thingy>(); 
        for (int i = 0; i < 5000; i++) 
        { 
            things.Add(new Thingy { Thing = i.ToString() }); 
        } 
        rptCheckBoxes.DataSource = things; 
        rptCheckBoxes.DataBind(); 
    } 
} 

protected void cb_OnCheckChanged(object sender, EventArgs e) 
{ 
    CheckBox cb = sender as CheckBox; 

    if (cb.Checked) 
    { 
        lblResult.Text = cb.Text; 
    } 
    else 
    { 
        lblResult.Text = "not checked"; 
    } 
} 

internal class Thingy 
{ 
    public string Thing { get; set; } 
}

运行Fiddler,快速单击复选框,最终显示格式错误的HTTP请求。

0 个答案:

没有答案