ASP.NET のエラー "ViewState は無効です" のトラブルシューティング

文書翻訳 文書翻訳
文書番号: 829743 - 対象製品
すべて展開する | すべて折りたたむ

目次

概要

この資料では、Microsoft ASP.NET アプリケーションのビューステートに関する問題のデバッグと解決のために使用できるいくつかの方法について説明しています。

はじめに

ビューステートは、サーバーの状態 (セッション状態など) に関係なく、ページに状態を自動保存できるようにする ASP.NET の機能です。ただし、ビューステートに関連する問題はデバッグが困難な場合があります。ビューステートに関する問題が発生すると、ほとんどの場合、Web ブラウザに次のエラー メッセージが表示されるだけで、問題の原因については示されません。
このページの ViewState は無効です。壊れている可能性があります。
この資料では、ビューステートに関する問題のデバッグと解決のために使用できるいくつかの方法について説明しています。

詳細

修正済みの問題が発生していないことを確認する

ASP.NET 1.0 の修正プログラムおよび Service Pack でビューステートの多くの問題が修正されており、それらの修正プログラムは ASP.NET 1.1 にも含まれています。既に解決済みの問題を追跡する前に、最新の修正プログラムを適用していることを確認してください。最新の Microsoft .NET Framework 更新プログラムは、以下の MSDN (Microsoft Developer Network) Web サイトから入手できます。
http://www.microsoft.com/japan/msdn/netframework/downloads/

Web ファームで実行中の場合は validationKey 属性を設定する

Web ファームでは、ポストバックごとに、それぞれのクライアント要求を異なるコンピュータに発行できます。この動作のため、Machine.config ファイルの validationKey 属性を AutoGenerate に設定したままにしておくことはできません。代わりに、validationKey 属性の値を、Web ファームのすべてのコンピュータで共有される固定文字列に設定する必要があります。

この問題の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
323744 [FIX] ASP.NET でエラー メッセージ "このページの ViewState は無効です。壊れている可能性があります。" が表示される

Web ファームでは、動的に生成される型をビューステートに格納しない

ASP.NET がファイルを動的にコンパイルする際、そのファイルは、基本的にランダムな名前 (jp395dun.dll などのファイル名) でアセンブリに組み込まれます。Web ファームを実行している場合、同じファイルが異なるランダムな名前でアセンブリにコンパイルされます。通常は、それらのアセンブリ名が前提とされることはないため、問題が発生することはありません。しかし、バイナリでのシリアル化を使用して、動的にコンパイルされる型をビューステートに格納していた場合は、アセンブリの名前がビューステート データの一部として含まれます。後で、そのビューステートが Web ファームの異なるサーバーに送られた場合、ビューステートが異なるアセンブリ名を使用しているため、そのビューステートは逆シリアル化できません。

この問題を解決する最善の方法は、バイナリでのシリアル化を使用しないことです。バイナリでのシリアル化は、この問題が発生していない場合でも多くのリソースを使用します。代わりに、ビューステートに格納する型を Array 型、Pair 型、Triplet 型、および単純型 (文字列、int などの型) の組み合わせに限定してください。System.Web.UI.Pair および System.Web.UI.Triplet は、ビューステート エンジンが効率的に処理できる単純ラッパー型です。

この問題を発生させないもう 1 つの解決方法は、ビューステートに格納している型を、Bin フォルダまたはグローバル アセンブリ キャッシュ内にあるプリコンパイルされたアセンブリに移動することです。この方法ではパフォーマンスの問題は解決されませんが、アセンブリの名前が確実にすべてのコンピュータで同じになります。

問題がビューステートの MAC 機能に関係しているかどうかを確認する

ビューステートの MAC (Machine Authentication Code) 機能の目的は、クライアントが無効なビューステートを含んだ要求を送信できないようにすることです。デフォルトで、この機能は Machine.config ファイル内の次のフラグで有効になっています。
enableViewStateMac="true"
処理している問題が MAC 機能に関係しているかどうかを確認する最も簡単な方法は、この機能をオフにすることです。これを行うには、Machine.config ファイル内のフラグを次のコードに変更します。
enableViewStateMac="false"
ビューステートのエラーが発生しなくなった場合、その問題は MAC 機能に関係しています。

重要 : 問題の診断に役立てるときにだけ、ビューステートの MAC 機能をオフにしてください。ビューステートの MAC をオフにしたままにして問題を回避しないでください。そうした場合は、セキュリティ ホールをもたらす可能性があります。詳細については、以下の MSDN Web サイトを参照してください。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdnaspp/htm/SecNetch08.asp
ビューステートの MAC 機能をオフにして、HTML エンコードしないコントロール (ラベル コントロールなど) にビューステートを使用した場合、攻撃者はビューステート データを不当に書き換えて、ビューステートに悪意のあるデータを格納できます。この悪意のあるデータはデコードされ、ページがポストバックされてコントロールが表示される際に、それらのコントロールによって使用されます。その結果、攻撃を防がない限り、攻撃者はアプリケーションにスクリプトを挿入できます。たとえば、攻撃者は、データをデコードし、ラベル コントロールのデータにスクリプトを挿入し、Web サイトからそのデータにリンクできます。そのリンクをクリックしたユーザーはだれでも、自分の認証 Cookie やセッション ID が盗まれる危険性のあるスクリプト挿入攻撃の犠牲者になる可能性があります。またこのスクリプトによって、攻撃者が、ビューステートを使用しているコントロールの状態データを変更する可能性もあり、結果として、アプリケーション固有の攻撃が発生する場合があります。

通常、マイクロソフトでは、出力を HTML エンコードしないすべてのコントロール (DataGrid コントロール、DataList コントロール、ラベル コントロールなどのコントロール) のビューステートを無効にしているか、または、常に、各要求に対するコントロールの値を、安全であると判明している値に明示的に設定していることが確実でない限り、ビューステートの MAC 機能をオフにしないことを推奨しています。

関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
316920 [PRB] Server.Transfer を使用するとエラー メッセージ "ViewState は無効です" が表示される
324488 高負荷の状態でフォーム認証とビューステートが断続的に失敗する

エラー メッセージが表示された際に発生した例外を正確に判断する

この資料の「はじめに」に記載されている無効なビューステートのエラー メッセージは、残念ながら、あまり役立ちません。このエラー メッセージは、通常、ビューステートの処理中にスローされた一部の例外によって発生します。問題なのは、例外が処理されると、エラー メッセージでその詳細が失われてしまうことです。

デバッガを使用すると、元の例外を確認できます。これを行うには、デバッガを ASP.NET のプロセス (Aspnet_wp.exe または W3wp.exe) に割り当て、すべての例外をキャッチするように設定する必要があります。デバッガは、いくつかの無関係な例外で停止する可能性がありますが、最終的にはビューステート例外をキャッチして、トラブルシューティングに役立つ情報を提供します。

ランタイム デバッガ (Cordbg.exe) の使用例を次の手順に示します。
  1. コマンド プロンプトで iisreset コマンドを実行し、開始点が適切であることを確認してから、サイトのページを表示します。
  2. コマンド プロンプトで cordbg.exe を実行します。
  3. コマンド プロンプトで pro と入力し、Enter キーを押します。マネージ プロセスの一覧が表示されます。Aspnet_wp.exe プロセスまたは W3wp.exe プロセスのいずれかを確認する必要があります。そのプロセスの PID をメモします。
  4. コマンド プロンプトで PID と入力し、そのプロセスに割り当てます。

    : PID は、手順 3. でメモした PID に置き換えます。
  5. プロンプトで ca e と入力し、Cordbg.exe にすべての例外で中断するように通知してから g と入力してそのプロセスを実行します。
  6. 例外に到達するたびに w と入力してスタックを確認します。スタックがビューステート例外であった場合 (スタックで LoadPageStateFromPersistenceMedium を検索します)、すべての例外情報とスタック情報をコマンド ウィンドウでコピーし、その情報を保存します。この情報を問題の理解に役立てることができます。例外が無関係であった場合は g と入力します。
関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
831150 "このページの ViewState は無効です" というエラー メッセージにトラブルシューティングに必要な情報が表示されない

セッションでビューステートを格納する

デフォルトで、ビューステートは、ブラウザに送信される <input type=hidden> フィールドによってラウンドトリップされます。ブラウザは、次の要求時にそのフィールドをサーバーに送り返します。場合によっては、このビューステートが非常に大きくなり、問題の発生源となる可能性が生じます。一部のブラウザはこのように大きな非表示フィールド (およびその結果生成される大容量の要求) を処理できないため、ブラウザによってビューステートが切り捨てられる場合があります。ビューステートを切り捨てた結果、ビューステートが破損しているというエラー メッセージが発生します。この動作は、通常、簡易ブラウザで発生します。たとえば、この動作は PDA のブラウザで発生する可能性があります。

このような問題が発生しているかどうかを確認するには、セッションでビューステートを格納してください。これを行う方法を次の例に示します。
			<%@ language=c# debug=true %>
			<script runat=server> 
protected override object LoadPageStateFromPersistenceMedium() 
{ 
     return Session["_ViewState"]; 
}
 
protected override void SavePageStateToPersistenceMedium(object viewState) 
{ 
     Session["_ViewState"] = viewState; 
}
 
void TextChanged(object o, EventArgs e) 
{ 
     Response.Write("TextChanged"); 
} 
</script>
			<form runat=server>
			<asp:button text=Test runat=server/>
			<asp:textbox ontextchanged=TextChanged runat=server/>
			<input type=hidden name=__VIEWSTATE>
			</form>
			

次のコード行は ASP.NET 1.0 の場合にだけ必要です (バグの回避のため)。ASP.NET 1.1 では必要ありません。
<input type=hidden name=__VIEWSTATE>

問題がワーカー プロセスのリサイクルによって発生しているのかどうかを確認する

次のような状況を想定します。
  • Microsoft インターネット インフォメーション サービス (IIS) 6.0 で ASP.NET を実行している。
  • アプリケーション プールが、ローカル システム アカウント、ネットワーク サービス アカウント、または管理者レベルのアカウント以外の ID で実行されている。
  • 構成ファイルで、<machineKey> 要素の validationKey 属性が AutoGenerate に設定されている。
この場合、次の手順を実行すると、ビューステートのエラーが発生します。
  1. ユーザーがページを表示する。
  2. ASP.NET アプリケーションをホストするワーカー プロセスがリサイクルされる。
  3. ユーザーがページをポストバックする。
この場合の現象を回避するには、構成ファイル内で明示的に validationKey 属性を使用します。 キーを作成する方法の関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
312906 [HOWTO] Visual C# .NET を使用して、フォーム認証に使用するキーを作成する方法
313091 Visual Basic .NET を使用してフォーム認証用のキーを作成する方法

関連情報

関連情報を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
316920 [PRB] Server.Transfer を使用するとエラー メッセージ "ViewState は無効です" が表示される
324488 高負荷の状態でフォーム認証とビューステートが断続的に失敗する
831150 "このページの ViewState は無効です" というエラー メッセージにトラブルシューティングに必要な情報が表示されない
詳細については、次の MSDN Web サイトを参照してください。
http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/jpdnaspp/htm/SecNetch08.asp

http://www.microsoft.com/japan/msdn/netframework/downloads/

プロパティ

文書番号: 829743 - 最終更新日: 2005年10月4日 - リビジョン: 2.2
この資料は以下の製品について記述したものです。
  • Microsoft ASP.NET 1.1
  • Microsoft ASP.NET 1.0
キーワード:?
kbstate kbwebforms kbinfo kbprb KB829743
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com