ASP.NET の状態管理の概要
更新 : 2007 年 11 月
ページがサーバーにポストされるたびに Web ページ クラスの新しいインスタンスが作成されます。従来の Web プログラミングでは、通常、ページが再作成されるということは、ページとページ上のコントロールに関連付けられたすべての情報がラウンド トリップのたびに失われることを意味します。たとえば、ユーザーがテキスト ボックスに情報を入力した場合、その情報は、ブラウザまたはクライアント デバイスからサーバーへのラウンド トリップにおいて失われます。
従来の Web プログラミングで継承されているこのような制限を克服するために、ASP.NET には、データをページ単位でもアプリケーション全体でも保存できるいくつかのオプションが用意されています。これらの機能は次のとおりです。
ビューステート
コントロールの状態
隠しフィールド
Cookie
クエリ文字列
アプリケーション状態
セッション状態
プロファイル プロパティ
ビューステート、コントロールの状態、隠しフィールド、Cookie、およびクエリ文字列のデータはいずれもさまざまな方法でクライアントに格納されます。ただし、アプリケーション状態、セッション状態、およびプロファイル プロパティのデータはいずれもサーバーのメモリに格納されます。シナリオによって、各オプションには長所も短所もあります。
クライアント ベースの状態管理オプション
以下の各セクションでは、ページ内またはクライアント コンピュータ上に情報を格納する状態管理オプションについて説明します。これらのオプションでは、ラウンド トリップ間でサーバーに情報が格納されることはありません。
ビューステート
ViewState プロパティは、同じページに対する複数の要求間で値を保持するためのディクショナリ オブジェクトを提供します。これは、ラウンド トリップ間でページとコントロールのプロパティ値を保持するためにページが使用する既定の方法です。
ページが処理されると、ページとコントロールの現在の状態が文字列にハッシュされ、1 つの隠しフィールドとしてページに保存されます。また、ViewState プロパティに格納されているデータ量が MaxPageStateFieldLength プロパティに指定された値を超えた場合は、複数の隠しフィールドとして保存されます。ページがサーバーにポストバックされると、ページの初期化処理でそのビューステート文字列が解析され、プロパティ情報がそのページに復元されます。
ビューステートに値を格納することもできます。ビューステートの使用方法の詳細については、「ASP.NET ビューステートの概要」を参照してください。ビューステートを使用するときの推奨事項については、「ASP.NET の状態管理に関する推奨事項」を参照してください。
コントロールの状態
コントロールが正しく機能するように、コントロールの状態データを格納することが必要になる場合があります。たとえば、それぞれ異なる情報を表示する複数のタブを持つカスタム コントロールを作成した場合、そのコントロールは、正常に機能するためにラウンド トリップ間でどのタブが選択されたかを認識する必要があります。そのために、ViewState プロパティを使用できますが、開発者がページ レベルでオフにできるため、コントロールが実質的に機能しなくなる可能性があります。これを解決するために、ASP.NET ページ フレームワークは、コントロールの状態という機能を ASP.NET に公開します。
ControlState プロパティは、コントロールに固有のプロパティ情報を保持できるようにします。ViewState プロパティと違ってオフにできません。
隠しフィールド
ASP.NET では、HTML の標準の隠しフィールドとして保持される HiddenField コントロールに情報を格納できます。隠しフィールドはブラウザに表示されませんが、標準のコントロールと同じようにプロパティを設定できます。ページがサーバーに送信されるときに、隠しフィールドの内容は他のコントロールの値と一緒に HTTP フォーム コレクション内で送信されます。隠しフィールドは、ページに直接格納する必要があるページ固有の情報のためのリポジトリとして機能します。
セキュリティに関するメモ : |
---|
悪意のあるユーザーにとっては、隠しフィールドの内容を見たり変更したりするのは簡単なことです。重要な情報やアプリケーションの正常な動作に必要な情報を隠しフィールドに格納しないでください。詳細については、「ASP.NET の状態管理に関する推奨事項」を参照してください。 |
HiddenField コントロールは、その Value プロパティに 1 つの変数を格納します。このコントロールは、ページに明示的に追加する必要があります。詳細については、「HiddenField Web サーバー コントロールの概要」を参照してください。
ページの処理中に隠しフィールドの値を使用できるようにするには、HTTP の POST コマンドを使用してページを送信する必要があります。隠しフィールドを使用しているときにページがリンクや HTTP GET コマンドへの応答として処理される場合、隠しフィールドは使用できません。使用上の推奨事項については、「ASP.NET の状態管理に関する推奨事項」を参照してください。
Cookie
Cookie は、クライアントのファイル システム上のテキスト ファイルに格納されるか、またはクライアント ブラウザ セッション内でメモリに格納される、小さなデータです。Cookie には、サーバーがページ出力と共にクライアントに送信する、サイト固有の情報が含まれています。Cookie は (特定の有効期限を付与して) 一時的に保存することも、永続的に保存することもできます。
Cookie を使用すると、特定のクライアント、セッション、またはアプリケーションに関する情報を保存できます。Cookie はクライアント デバイスに保存されます。ブラウザがページを要求すると、クライアントは、要求情報と一緒に Cookie の情報も送信します。サーバーが Cookie を読み取り、値を抽出します。Cookie の一般的な用途には、ユーザーがアプリケーションで既に認証されていることを示すための (通常は暗号化される) トークンの格納があります。
セキュリティに関するメモ : |
---|
ブラウザは、Cookie の作成元であるサーバーにデータを送り返すことしかできません。しかし、悪意のあるユーザーは、Cookie にアクセスし、その内容を読み取る方法を熟知しています。ユーザー名やパスワードのような重要な情報は Cookie に格納しないことをお勧めします。その代わりに、ユーザーを識別するトークンを Cookie に格納し、そのトークンを使ってサーバー上の重要な情報を参照するようにしてください。 |
Cookie の使用方法の詳細については、Cookies プロパティについてのトピックおよび「ASP.NET の状態管理に関する推奨事項」を参照してください。
クエリ文字列
クエリ文字列は、ページの URL の最後に追加される情報です。一般的なクエリ文字列の例を次に示します。
https://www.contoso.com/listwidgets.aspx?category=basic&price=100
上記の URL パスのクエリ文字列は、疑問符 (?) で始まり、"category" と "price" という 2 つの属性値を含んでいます。
クエリ文字列は、状態情報を保持するための単純な方法ですが、いくつかの制限があります。たとえば、あるページから他のページに製品番号を渡して処理する場合など、ページ間で情報を渡すためにはクエリ文字列を使用すると簡単です。ただし、ブラウザやクライアント デバイスには、URL の長さが 2,083 文字に制限されているものがあります。
セキュリティに関するメモ : |
---|
クエリ文字列によって渡される情報は、悪意のあるユーザーによって変更される可能性があります。重要なデータや機密データを受け渡す場合はクエリ文字列に依存しないでください。さらに、ユーザーは URL のブックマークを作成したり、URL を他のユーザーに送信したりして、URL と一緒に重要な情報を渡す可能性があります。詳細については、「ASP.NET の状態管理に関する推奨事項」および「方法 : HTML エンコーディングを文字列に適用して Web アプリケーションをスクリプトによる攻略から保護する」を参照してください。 |
ページの処理中にクエリ文字列の値を使用できるようにするには、HTTP の GET コマンドを使用してページを送信する必要があります。つまり、ページが HTTP の POST コマンドへの応答として処理される場合は、クエリ文字列を利用できません。使用上の推奨事項については、「ASP.NET の状態管理に関する推奨事項」を参照してください。
サーバー ベースの状態管理オプション
ASP.NET には、状態情報をクライアントではなくサーバーに保持するためのいくつかの方法が用意されています。サーバーベースの状態管理では、状態を保存するためにクライアントに送信する情報の量を削減できますが、サーバー上のリソースが大量に使用される可能性があります。次のセクションでは、アプリケーション状態、セッション状態、プロファイル プロパティの 3 つのサーバーベース状態管理機能について説明します。
アプリケーション状態
ASP.NET では、アクティブな Web アプリケーションごとに、アプリケーション状態 (HttpApplicationState クラスのインスタンス) を使用して値を保存できます。アプリケーション状態は、Web アプリケーションのすべてのページからアクセスできるグローバルなストレージ機構です。そのため、アプリケーション状態は、サーバーへのラウンド トリップ間やページへの各要求間で維持する必要のある情報を格納するのに役立ちます。詳細については、「ASP.NET のアプリケーション状態の概要」を参照してください。
アプリケーションの状態は、特定の URL への各要求時に作成される、キーと値のディクショナリに格納されます。この構造体にアプリケーション固有の情報を追加することにより、ページ要求間で情報を保持できます。
アプリケーション状態にアプリケーション固有の情報が追加された後は、サーバーがそれを管理します。使用上の推奨事項については、「ASP.NET の状態管理に関する推奨事項」を参照してください。
セッション状態
ASP.NET では、アクティブな Web アプリケーションのセッションごとに、セッション状態 (HttpSessionState クラスのインスタンス) を使用して値を保存できます。概要については、「ASP.NET セッション状態の概要」を参照してください。
セッション状態はアプリケーション状態と似ていますが、スコープが現在のブラウザ セッションに限られる点で異なります。複数のユーザーがアプリケーションを使用している場合は、ユーザー セッションごとにセッション状態が異なります。また、同じユーザーがアプリケーションの使用をいったん中断し、その後で再度アプリケーションを使用した場合も、ユーザー セッションは、最初のセッションとは別のセッション状態になります。
セッション状態は、サーバーへのラウンド トリップ間およびページへの要求間で保持する必要のあるセッション固有の情報を格納するために使用される、キーと値のディクショナリとして構成されます。詳細については、「ASP.NET セッション状態の概要」を参照してください。
セッション状態を使用して、次のタスクを実行できます。
ブラウザまたはクライアント デバッグからの要求を一意に識別し、それをサーバー上の個別のセッション インスタンスに割り当てる。
セッション固有のデータをサーバー上に格納して、同じセッション内でブラウザまたはクライアント デバイスからの複数の要求に対して使用する。
適切なセッション管理イベントを発生させる。また、それらのイベントを利用するアプリケーション コードを記述する。
セッション状態にアプリケーション固有の情報が追加された後は、サーバーがこのオブジェクトを管理します。セッション情報は、指定したオプションに従って、Cookie、アウトプロセス サーバー、または Microsoft SQL Server を実行しているコンピュータに格納できます。使用上の推奨事項については、「ASP.NET の状態管理に関する推奨事項」を参照してください。
プロファイル プロパティ
ASP.NET には、ユーザー固有のデータを格納できる、プロファイル プロパティという機能が用意されています。この機能はセッション状態とよく似ていますが、ユーザー セッションの有効期限が切れても、プロファイル データは失われません。プロファイル プロパティ機能は、永続的な形式で格納され、個々のユーザーに関連付けられる ASP.NET プロファイルを使用します。ASP.NET プロファイルを使用すると、独自のデータベースを作成したり管理したりする手間をかけずに、ユーザー情報を容易に管理できます。また、このプロファイルでは、アプリケーション内のどこからでもアクセスできる、厳密に型指定された API を使ってユーザー情報を利用できます。このプロファイルには、任意の型のオブジェクトを格納できます。ASP.NET プロファイル機能は、ほとんどの種類のデータを定義および管理できると同時に、データをタイプ セーフな形で利用できるようにする汎用ストレージ システムを提供します。
プロファイル プロパティを使用するには、プロファイル プロバイダを設定する必要があります。ASP.NET には、プロファイル データを SQL データベースに格納できるようにする SqlProfileProvider クラスが含まれていますが、プロファイル データをカスタム形式で格納したり、XML ファイルなどのカスタム ストレージ メカニズムや Web サービスに格納したりする独自のプロファイル プロバイダ クラスを作成することもできます。
プロファイル プロパティに配置されるデータは、アプリケーション メモリに格納されないため、インターネット インフォメーション サービス (IIS) やワーカー プロセスを再起動してもデータが失われずに保護されます。また、プロファイル プロパティは、Web ファームや Web ガーデンなどの複数のプロセスでも保持できます。詳細については、「ASP.NET プロファイル プロパティの概要」を参照してください。