当更新面板中的回发发生得太快时,似乎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请求。