アプリケーションの状態管理とは
デスクトップアプリケーション、Webアプリケーションなどの種類に限らず、アプリケーションを開発していくにはさまざまな「状態」を適切に管理する必要があります。
「状態」とは何かというと、例えばログイン情報や検索前後といったフラグ、画面の表示内容などのあらゆるデータが該当します。
これらの状態を管理する方法ですが、デスクトップアプリケーションであれば単にメモリ上に格納しておけばよいでしょう。しかし、ASP.NET Webフォームアプリケーションの場合、そうはいきません。本来Webはステートレスであり、メモリに状態を格納したとしても、次回のアクセスには利用できません。
そこで、ASP.NET Webフォームアプリケーションにはこの特性を回避するためのさまざまな状態管理の方法が用意されています。その方法はそれぞれ保管場所、生存期間などが違い、目的に合わせてさまざまな状態管理手段を使い分ける必要があります。
状態管理方法の種類
ASP.NET Webフォームアプリケーションで用意された状態管理方法の概念図を以下に示します。
それぞれについて簡単に説明していきましょう。
Application(アプリケーション状態)
Webアプリケーションが起動してから終了するまでの間、状態をサーバー側で保持します。アプリケーションが再起動すると、その値は失われます。
Cache(キャッシュ)
Webアプリケーションが起動してから終了するまでの間、状態をサーバー側に保持することはApplicationと同じです。しかし、Cacheは有効期限を設定することができ、有効期限が設定された状態は、不要になれば自動的に破棄される点が異なります(有効期限を設定しない場合はApplicationと同じです)。
Applicationと同じように、アプリケーションが再起動すると、その値は失われます。
Session(セッション状態)
セッション、つまりブラウザを開いてから閉じるまでの一連のやりとりの間、状態をサーバー側に保存します。そのため、別ページに移動しても値は保持され続けますので、画面をまたいだ状態管理によく用いられます。
ただし、別のセッションに値は引き継がれません。セッションをまたいだ状態保持にはApplicationやCache、Profileを用います。
Profile(プロファイル)
ユーザーごとに状態をサーバー側に保存します。その状態は複数のセッションをまたいで保存されます。また、概念図では表されていませんが、アプリケーションが再起動されてもその値は保存されているため、次回アクセス時に再び使用することができます。
ユーザーをまたいだ状態管理にはApplicationやCacheを使います。
ViewState
View(表示)のState(状態)という名のとおり、単一画面に閉じた状態を保持します。
ApplicationやSessionなどの他の仕組みとは異なり、状態をinputタグの"__VIEWSTATE"という名前のhiddenフィールドに埋め込み、クライアント側に保存します。その値をPostBackでサーバーに送信することにより、状態を維持します。
設定した値は他のページに遷移すると失われてしまいます。従って、画面をまたいだ状態は通常はSessionに保存し、ViewStateは使い捨てのフラグなど、あまり大きくないデータを保存するのに使用します。
また、ASP.NET Webフォームアプリケーションでは、サーバーコントロールの値以外の状態、例えばラベルコントロールのテキストやドロップダウンリストコントロールの選択肢のリスト、コントロールの文字色、背景色などを保存するために、自動的にViewStateが使用されています。