ポストバック中の「オブジェクトの現在の状態のため、操作は無効です」エラー


170

正常に動作しているaspxページがありましたが、突然「オブジェクトの現在の状態のため、操作が無効です」というエラーが発生します。ポストバックが行われるときはいつでも。

スタックトレースは次のとおりです。

System.Web.HttpRequest.FillInFormCollection()でSystem.Web.HttpValueCollection.ThrowIfMaxHttpCollectionKeysExceeded()
でSystem.Web.HttpValueCollection.FillFromEncodedBytes(Byte [] bytes、Encoding encoding)
で

誰かがお手伝いできますか?


回答:


281

誰かがあなたのページにかなりの数のフォームフィールドを投稿しました。最近のセキュリティアップデートで導入された新しいデフォルトの最大値は1000です。

web.configの<appsettings>ブロックに次の設定を追加してみてください。このブロックでは、MaxHttpCollection値を最大化しています。これは、.net Frameworkによって設定されたデフォルトをオーバーライドします。フォームのニーズに応じて値を変更できます

<appSettings>
    <add key="aspnet:MaxHttpCollectionKeys" value="2001" />
 </appSettings>

詳細については、この投稿をお読みください。マイクロソフトによるセキュリティパッチの詳細については、このナレッジベースの記事を参照してください。



40

グリッドビューにページングを適用せず、600以上のレコード(チェックボックス、ボタンなどを含む)に及び、2001の値が機能しませんでした。値を増やして、たとえば10000とテストします。

<appSettings>
<add key="aspnet:MaxHttpCollectionKeys" value="10000" />
</appSettings>

16

ASP.NET 1.1の場合、これは依然として1000を超えるフォームフィールドを投稿したことが原因ですが、設定は構成ファイルではなくレジストリで変更する必要があります。以下のレジストリにMaxHttpCollectionKeysという名前のDWORDとして追加する必要があります

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\1.1.4322.0

32ビット版のWindows、および

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\ASP.NET\1.1.4322.0

64ビット版のWindowsの場合。


6

スタックトレースが次のようになっている場合は、大量のjsonオブジェクトをサーバーに送信しています

Operation is not valid due to the current state of the object. 
    at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeDictionary(Int32 depth)
    at System.Web.Script.Serialization.JavaScriptObjectDeserializer.DeserializeInternal(Int32 depth)
    at System.Web.Script.Serialization.JavaScriptObjectDeserializer.BasicDeserialize(String input, Int32 depthLimit, JavaScriptSerializer serializer)
    at System.Web.Script.Serialization.JavaScriptSerializer.Deserialize(JavaScriptSerializer serializer, String input, Type type, Int32 depthLimit)
    at System.Web.Script.Serialization.JavaScriptSerializer.DeserializeObject(String input)
    at Failing.Page_Load(Object sender, EventArgs e) 
    at System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
    at System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
    at System.Web.UI.Control.OnLoad(EventArgs e)
    at System.Web.UI.Control.LoadRecursive()
    at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)

解決するには、次のキーを使用してWeb構成を更新してください。スタックトレースを取得できない場合は、fiddlerを使用してください。それでも解決しない場合は、数を10000程度に増やしてみてください。

<configuration>
<appSettings>
<add key="aspnet:MaxJsonDeserializerMembers" value="1000" />
</appSettings>
</configuration>

詳細については、お読みください。このマイクロソフトのKBの記事を

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.