更新パネルでポストバックが発生するのが速すぎる場合、ASP.NET クライアント側 JavaScript にバグがあり、サーバーに送信する本文が HTTP ヘッダーのコンテンツ長と一致しないようです。これにより、IIS 7.5 は、ビュー ステート変数が切り捨てられたときに (特定のアプリに対して) "無効な base-64" 例外をスローします。Fiddler トレースは、HTTP 要求が実際には不正な形式であることを示しています。
私の本番環境では (複数のページで発生します)、ビュー ステートが非常に大きいことが原因です。はい、それをトリミングするか、完全に取り除くことができます。しかし、質問は、クライアントが体を切り詰める理由とそれを回避する方法を知っている人はいますか?
独自の JavaScript をまったく追加していないことを考えると、MS クライアント側の JavaScript に問題があるように思えます。Firefox ではなく IE8/9 と Chrome でのみトリガーしたことに注意してください。Firefox は別のソケット ライブラリを使用している可能性があります (まだ nspr です)。
以下は、問題を説明するために考案した例です。「Web サイト」にページを追加し、.Net 4 で VS10 を使用しています。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 要求が表示されます。