ASP.NET:データを検証できません
-
02-07-2019 - |
質問
ASP.NETでのこの例外の原因は何ですか?明らかにビューステートの例外ですが、例外をスローしているページ(ボタンとナビゲーションリンクを備えた単純な2つのTextBoxフォーム)でエラーを再現することはできません。
FWIW、Webファームを実行していません。
例外
エラーメッセージ:検証できません データ。
エラーソース:System.Web
エラーターゲットサイト:Byte [] GetDecodedData(Byte []、Byte []、Int32、 Int32、Int32 ByRef)
投稿データ
VIEWSTATE:
/ wEPDwULLTE4NTUyODcyMTFkZF96FHxDUAHIY3NOAMRJYZ + CKsnB
イベント検証:
/ wEWBAK + 8ZzHAgKOhZRcApDF79ECAoLch4YMeQ2ayv / Gi76znHooiRyBFrWtwyg =
例外スタックトレース
at System.Web.UI.ViewStateException.ThrowError(Exception inner, String persistedState, String errorPageMessage, Boolean macValidationError)
at System.Web.UI.ObjectStateFormatter.Deserialize(String inputString)
at System.Web.UI.ObjectStateFormatter.System.Web.UI.IStateFormatter.Deserialize(String serializedState)
at System.Web.UI.Util.DeserializeWithAssert(IStateFormatter formatter, String serializedState)
at System.Web.UI.HiddenFieldPageStatePersister.Load()
at System.Web.UI.Page.LoadPageStateFromPersistenceMedium()
at System.Web.UI.Page.LoadAllState()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
at System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
at System.Web.UI.Page.ProcessRequest()
at System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context)
at System.Web.UI.Page.ProcessRequest(HttpContext context)
at ASP.default_aspx.ProcessRequest(HttpContext context)
at System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
〜ウィリアム・ライリー・ランド
解決
このエラーの原因として最も可能性が高いのは、すべてのビューステートが読み込まれる前にポストバックが停止した場合(ユーザーが[停止]または[戻る]ボタンを押す)、ビューステートが検証に失敗してエラーをスローすることです。
その他の潜在的な原因:
- ビューステートが生成されてからユーザーがサーバーにポストバックするまでの間のアプリケーションプールのリサイクル(可能性は低い)。
- machineKeysが同期されないWebファーム(問題ではありません)。
更新:この問題に関するMicrosoftの記事。上記に加えて、彼らは2つの他の潜在的な原因を示唆しています:
- ファイアウォール/アンチウイルスソフトウェアによるビューステートの変更
- あるaspxページから別のページへの投稿。
他のヒント
.NET 3.5 SP1では、 RenderAllHiddenFieldsAtTopOfForm プロパティがPagesSection構成に追加されました。
Web.config
<configuration>
<system.web>
<pages renderAllHiddenFieldsAtTopOfForm="true"></pages>
</system.web>
</configuration>
興味深いことに、これのデフォルト値はtrueです。つまり、本質的に、.NET 3.5 SP1を使用している場合、ViewStateはフォームの最上部(ページの残りの部分が読み込まれる前)に自動的にレンダリングされるため、取得しているViewStateエラーがなくなります。
特定のバージョンのSafari 3で問題が発生しました。私の解決策は、ViewStateをフォームの最上部に移動することでした(Pageクラスを拡張し、3.5 SP1以前または.Net 3.5のRenderメソッドを上書きしました) SP1以降はデフォルトでこれを行います)、ViewStateを1つのモンスターファイルの代わりにいくつかの異なるフィールドに分割します。 ASP.NET 2.0のViewStateチャンキング(maxPageStateFieldLength)
この無料のオンラインツール: http://aspnetresources.com/tools/machineKey はmachineKey要素を生成しますweb.configファイルのsystem.web要素の下。 生成されるものの例を次に示します。
<machineKey validationKey="1619AB2FDEE6B943AD5D31DD68B7EBDAB32682A5891481D9403A6A55C4F91A340131CB4F4AD26A686DF5911A6C05CAC89307663656B62BE304EA66605156E9B5" decryptionKey="C9D165260E6A697B2993D45E05BD64386445DE01031B790A60F229F6A2656ECF" validation="SHA1" decryption="AES" />
web.configでこれを確認すると、エラー自体が突然意味をなします。 表示されるエラーには
と表示されます&quot;構成が同じことを指定していることを確認する validationKeyと検証アルゴリズム&quot;。
このmachineKey要素を見ると、突然それが何について話しているのかがわかります。
「ハードコーディング」による; web.configのこの値、asp.netがビューステートのシリアル化とシリアル化解除に使用するキーは、サーバーファーム内のどのサーバーがそれを取得しても同じままです。暗号化は「ポータブル」になり、ビューステートは「ポータブル」になります。
また、何らかの理由で「忘れる」場合、非常に同じサーバー(ファーム内ではない)にこの問題があるのではないかと推測しています。消去されたすべてのレベルでリセットされたため、キーがありました。おそらく、アイドル期間後にこのエラーが表示され、「古い」を使用しようとする理由です。ページ。
&quot;すべてのビューステートがロードされる前にポストバックが停止します&quot;
この問題は以前にもありましたが、これが原因でした。
最初にViewStateMacプロパティを無効にして( page
ディレクティブの enableViewStateMac =&quot; false&quot;
)解決しましたが、これは問題の真の解決策ではなく、データの整合性を脅かす可能性があります。最終的には、ページが完全に読み込まれるまで送信ボタンを無効にし、一部のコントロールで無効にすることでビューステートのサイズをトリミングすることで解決しました。
この問題の根源をウェブサイトで見つけて、ようやく解決することができました。これはあなたの質問に対する直接的な答えではありませんが、この小さな情報を共有したかったのです。
過去にすべてを試してみました(上記のJeffaxeによって提案された解決策を含む)が、結果はなく、 enableViewStateMac =&quot; false&quot;
を設定したくありませんでした)これは問題を隠しているだけなので、私のページに。
私の場合、問題の原因は何ですか?この問題は、私のWebサイトの特定のページで Intelligencia.UrlRewriter (バージョン2.0 RC 1ビルド6)モジュールを使用したことが原因でした。いくつかのSEOフレンドリーリンクを使用していたため、ViewStateの検証エラーが発生していました。 「通常」を使用した場合リンク(SEOに優しいリンクの代わりに)問題は消えました!
問題を数回再現して、誤報ではないことを確認しました(ASP.NET 3.5を使用しています)。
上記のモジュールを使用していない人もいることを知っていますが、それでもこのエラーが発生します。これは、原因が別のものであることを意味しています。少なくとも、この経験を共有することは一部の人に役立つかもしれません。
アクション属性のないページにフォームタグを設定したときにこのエラーが発生し、コードビハインドでフォームのアクション属性を&quot; Action.aspx&quot;に変更しました。
そしてJavaScriptで、フォームを送信しました(theForm.submit();)
私の場合、これはセキュリティ上の問題であり、ページに既に設定されている場合、これを変更できないと思います...
これがだれにも役立つかどうかはわかりませんが、私の解決策は、クッキーが渡されるようにwebconfigでmachineKeyを除外することでした。