2012年3月3日土曜日

[HttpException (0x80004005): URL にエンコードされたフォーム データが有効ではありません。]

オブジェクトの現在の状態に問題があるため、操作は有効ではありません。
説明: 現在の Web 要求を実行中に、ハンドルされていない例外が発生しました。エラーに関する詳細および例外の発生場所については、スタック トレースを参照してください。

例外の詳細: System.InvalidOperationException: オブジェクトの現在の状態に問題があるため、操作は有効ではありません。

ソース エラー:

現在の Web 要求の実行中にハンドルされていない例外が生成されました。障害の原因および発生場所に関する情報については、下の例外スタック トレースを使って確認できます。

スタック トレース:


[InvalidOperationException: オブジェクトの現在の状態に問題があるため、操作は有効ではありません。]
System.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded() +2420362
System.Web.HttpValueCollection.FillFromEncodedBytes(Byte[] bytes, Encoding encoding) +58
System.Web.HttpRequest.FillInFormCollection() +159

[HttpException (0x80004005): URL にエンコードされたフォーム データが有効ではありません。]
System.Web.HttpRequest.FillInFormCollection() +217
System.Web.HttpRequest.get_Form() +104
System.Web.HttpRequest.get_Item(String key) +40
Telerik.Web.UI.RadCompression.IsAjaxRequest() +50
Telerik.Web.UI.RadCompression.Compress(HttpApplication application) +373
Telerik.Web.UI.RadCompression.PreRequestHandlerExecute(Object sender, EventArgs e) +43
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75


原因としては、「MS11-100」によって、.NET Framework のいくつかの問題が解決されています。

これにより導入されたセキュリティパッチの中に、「一時的にハッシュテーブルの衝突に友なる潜在的な DoS 攻撃を軽減する」を修正するために、POSTデータの多くを含むページの PostBack に問題が生じます。
幾つかの情報から、PostBack 項目が 500 に到達すると上のようなエラーが発生するようです。

回避策は、画面上のコントロールの数を少なくするのがいいのでしょうが、実際に動いているサービスではそれは難しい事になってくる。

私も最初この問題が発生したときに、PostBack に必要なデータが多すぎるために発生しているのではないかと推測はできた。
しかし、なかなか有効な情報に辿りつけなくて...さまよっていた。考える事、1時間そうかぁ validateRequest や PostBack 時の検証のチェックをしなければ....っと思って
Page で設定を行なってみたが、やはり解決しない。

結論を書くと、正確な対応としては、上記にある通り、一画面に出るコントロールを減らすのがセキュリティ面から考えても正しいのだろう。しかし、そうも行っていられない。


web.config に、
<appsettings>
<add key="aspnet:MaxHttpCollectionKeys" value="5001" />
</appSettings>
と記述するだけで、少なくても上限だと思われる10倍の5001個のコントロールになる。
後は、環境で増やしていけばいい。

根本解決ではないけど、回避策にはなる。

0 件のコメント:

コメントを投稿