Share via


ASP.NET のアプリケーション状態の概要

更新 : 2007 年 11 月

アプリケーション状態は、ASP.NET アプリケーションのすべてのクラスが使用できるデータ リポジトリです。アプリケーション状態はサーバーのメモリに格納され、データベースに情報を格納して取得するより高速です。個々のユーザー セッションに適用されるセッション状態とは異なり、アプリケーション状態はすべてのユーザーとセッションに適用されます。したがって、アプリケーション状態はユーザー間で変化しない頻繁に使用される少量のデータの格納に便利な場所です。ユーザーごとにデータを保存する方法については、「ASP.NET セッション状態の概要」と「ASP.NET プロファイル プロパティの概要」を参照してください。

アプリケーション状態の使用

アプリケーション状態は、HttpApplicationState クラスのインスタンスに格納されます。このクラスは、オブジェクトのキーと値の辞書を公開します。

HttpApplicationState インスタンスは、ユーザーがアプリケーションの任意の URL リソースに最初にアクセスする際に作成されます。多くの場合、HttpApplicationState クラスには、HttpContext クラスの Application プロパティを使用してアクセスします。

アプリケーション状態は、次の 2 つの方法で使用できます。Contents コレクションに対しては、コードを使用して直接値を追加、アクセス、または削除できます。HttpApplicationState クラスには、アプリケーションのライフ サイクル中にいつでもアクセスできます。ただし、アプリケーション状態のデータは、一般にアプリケーションの起動時に読み込むと便利です。そのためには、アプリケーション状態を読み込むコードを Global.asax ファイルの Application_Start メソッドに記述します。詳細については、「IIS 5.0 および 6.0 における ASP.NET アプリケーションのライフ サイクルの概要」を参照してください。

Web アプリケーションの Global.asax ファイルの <object runat="server"> 宣言を使用してオブジェクトを StaticObjects コレクションに追加することもできます。この方法で定義したアプリケーション状態は、アプリケーションのすべてのコードからアクセスできます。アプリケーション状態の値のためのオブジェクト宣言の例を次に示します。

<object runat="server" scope="application" ID="MyInfo" 
    PROGID="MSWC.MYINFO">
</object>

オブジェクトを StaticObjects コレクションに追加できるのは、Global.asax ファイル内だけです。コレクションは、コードを使用してオブジェクトを直接追加すると、NotSupportedException をスローします。

アプリケーション状態に格納されているオブジェクトのメンバには、Application コレクションを参照せずにアクセスできます。アプリケーション状態の StaticObjects コレクションで定義されているオブジェクトのメンバを参照する方法のコード例を次に示します。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
    Label1.Text = MyInfo.Title
End Sub
protected void Page_Load(Object sender, EventArgs e)
    Label1.Text = MyInfo.Title;
End Sub

アプリケーション状態の考慮事項

アプリケーション状態を使用する場合は、次のような重要な考慮事項に注意する必要があります。

  • リソース   アプリケーション状態はメモリに格納されるため、ディスクまたはデータベースに保存されるデータよりはるかに高速です。ただし、アプリケーション状態に大きなデータ ブロックを格納すると、サーバーのメモリが不足し、メモリがディスクにページングされることがあります。大量のアプリケーション データを格納するために、アプリケーション状態の代わりに ASP.NET のキャッシュ機構を使用することもできます。ASP.NET のキャッシュもメモリにデータを格納するので非常に高速ですが、ASP.NET はキャッシュをアクティブに管理してメモリが不足すると項目を削除します。詳細については、「ASP.NET のキャッシュの概要」を参照してください。

  • 揮発性   アプリケーション状態はサーバーのメモリに格納されるため、アプリケーションが停止または再起動すると消失します。たとえば、Web.config ファイルが変更されるとアプリケーションが再起動され、アプリケーション状態の値をデータベースなどの不揮発性の記憶媒体に保存していなければ、すべてのアプリケーション状態が消失します。

  • スケーラビリティ   アプリケーション状態は同じアプリケーションにサービスを提供する複数のサーバー間 (Web ファームなど)、または同じサーバーの同じアプリケーションにサービスを提供する複数のワーカー プロセス間 (Web ガーデンなど) で共有されません。したがって、複数のサーバーまたはプロセスに同じアプリケーション状態のデータがあることを前提にすることはできません。アプリケーションがマルチプロセッサ環境またはマルチサーバー環境で実行される場合、アプリケーション全体で一貫性を保持する必要があるデータには、データベースなどのよりスケーラブルな方法を使用することを考慮してください。

  • 同時実行   アプリケーション状態はフリー スレッドのため、アプリケーション状態のデータには同時に多くのスレッドがアクセスできます。したがって、アプリケーション状態のデータを更新するタイミングが重要になります。組み込みの同期機能をサポートすると、スレッド セーフな方法でアプリケーション状態のデータを更新できます。Lock メソッドと UnLock メソッドを使用すると、一度に 1 つのソースだけが書き込むことができるようにデータをロックすることによってデータの整合性を維持できます。Global.asax ファイルの Application_Start メソッドでアプリケーション状態の値を初期化すると、同時実行の問題の発生を軽減できます。詳細については、「IIS 5.0 および 6.0 における ASP.NET アプリケーションのライフ サイクルの概要」を参照してください。

参照

処理手順

方法 : アプリケーション状態の値を保存する

方法 : アプリケーション状態から値を読み取る

概念

ASP.NET の状態管理の概要

その他の技術情報

ASP.NET 状態管理の新機能