ハイパーテキスト転送プロトコル (HTTP) はステートレス プロトコルです。クライアントがサーバーから切断されると、ASP.NET エンジンはページ オブジェクトを破棄します。このようにして、各 Web アプリケーションは、サーバーのメモリを使い果たすことなく、多数のリクエストを同時に処理できるように拡張できます。
ただし、リクエスト間で情報を保存し、必要なときに取得するには、何らかのテクニックが必要です。この情報は状態と呼ばれ、現在のセッションで現在のユーザーが使用するすべてのコントロールと変数の現在の値です。
ASP.NET は 4 つの状態を管理します。
ビューステート
制御状態
セッション状態
申請状況
ビューステートは、ページとそのすべてのコントロールの状態です。 ASP.NET フレームワークのフィードバックを通じて変更されません。
ページがクライアントに送り返されると、これらのページ変更のプロパティとコントロールが決定され、_VIEWSTATE という名前の非表示の入力フィールドの値に保存されます。ページが再びポストバックされると、_VIEWSTATE フィールドが HTTP リクエストとともにサーバーに送信されます。
ビューステートは、以下に対して有効または無効にすることができます。
アプリケーション全体: web.config ファイル内のセクションの EnableViewState プロパティを設定します。
ページ: ページ コマンドの EnableViewState プロパティを <%@ Page Language="C#" EnableViewState="false" %> に設定します。
コントロール: control.EnableViewState プロパティを設定します。
これは、ビュー ステート項目のセットによって定義される StateBag クラスによって定義されるビュー ステート オブジェクトを使用して行われます。 StateBag は、プロパティ値のペアを含むデータ構造であり、オブジェクトに関連付けられた文字列として保存されます。
StateBag クラスには次のプロパティがあります。
財産 | 説明する |
---|---|
アイテム(名前) | 指定された名前のビューステートの値。これは、StateBag のデフォルトのプロパティです。 |
カウント | ステータスコレクション内の項目の名前。 |
キー | コレクション内のすべてのアイテムのキーのコレクション。 |
価値観 | コレクション内のすべての項目の値のコレクション。 |
StateBag クラスには次のメソッドがあります。
方法 | 説明する |
---|---|
Add(名前, 値) | ビューステート コレクションに項目を追加し、既存の項目を更新します。 |
クリア | コレクションからすべてのアイテムを削除します。 |
等しい(オブジェクト) | 指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。 |
ファイナライズ | リソースの解放やその他のクリーンアップ操作の実行を許可します。 |
GetEnumerator | StateBag オブジェクトに格納されている重複した StateItem オブジェクトのキー/値ペアのカウンターを返します。 |
GetType | 現在のインスタンスのタイプを取得します。 |
アイテムがダーティである | StateBag に格納されているオブジェクトをチェックして、変更されているかどうかを確認します。 |
(名前) を削除します | カスタム項目を削除します。 |
ダーティを設定する | StateBag オブジェクトの状態と、含まれる各 StateItem オブジェクトの Dirty プロパティを設定します。 |
SetItemDirty | StateBag オブジェクト内の指定された StateItem オブジェクトの Dirty プロパティを設定します。 |
ToString | ステータス パッケージ オブジェクトを表す文字列を返します。 |
次の例は、ビューステートを格納する文字列の概念を示しています。
ページ上のボタンをクリックしてページがコールバックされるたびに増分できるカウンターを保持しましょう。ラベル コントロールにはカウンターの値が表示されます。
タグファイルのコードは次のようになります。
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="statedemo._Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <h3>View State demo</h3> Page Counter: <asp:Label ID="lblCounter" runat="server" /> <asp:Button ID="btnIncrement" runat="server" Text="Add Count" onclick="btnIncrement_Click" /> </div> </form> </body></html>
このインスタンスの分離コード ファイルは次のようになります。
public partial class _Default : System.Web.UI.Page{ public int counter { get { if (ViewState["pcounter"] != null) { return ((int)ViewState["pcounter"]); } else { return 0; } } set { ViewState["pcounter"] = value; } } protected void Page_Load(object sender, EventArgs e) { lblCounter.Text = counter.ToString(); counter++; }}
次のような結果が得られます。
コントロールの状態を直接変更、アクセス、または無効にすることはできません。
ユーザーが ASP.NET Web サイトに接続すると、新しいセッション オブジェクトが作成されます。セッション状態が有効になっている場合、新しいリクエストごとに新しいセッション状態が作成されます。このセッション状態オブジェクトはランタイム環境の一部となり、ページから使用できます。
セッション状態は通常、在庫、サプライヤー リスト、顧客記録、ショッピング カートなどのアプリケーション データを保存するために使用されます。ユーザーの情報と好みの情報を保存し、ユーザーの未決定のパスを保存できます。
セッションは 120 ビットの SessionID によって識別および追跡され、クライアントからサーバーに渡され、Cookie または変更された URL として返されます。 SessionID はグローバルに一意でランダムです。
セッション状態オブジェクトは、セッション状態項目のコレクションを定義する HttpSessionState クラスによって作成されます。
HttpSessionState クラスには次のプロパティがあります。
財産 | 説明する |
---|---|
セッションID | 一意のセッション識別子。 |
アイテム(名前) | 指定された名前のセッション状態項目の値。これは、HttpSessionState クラスのデフォルトのプロパティです。 |
カウント | セッション状態コレクション内の項目の数。 |
タイムアウト | プロバイダーがセッション状態を停止するまでの、要求間の許容時間を分単位で取得および設定します。 |
HttpSessionState クラスには次のメソッドがあります。
方法 | 説明する |
---|---|
Add(名前, 値) | セッション状態コレクションに新しい項目を追加します。 |
クリア | セッション状態コレクションからすべての項目を削除します。 |
(名前) を削除します | 指定された項目をセッション状態コレクションから削除します。 |
すべて削除 | セッション状態コレクションからすべてのキーと値を削除します。 |
削除場所 | 指定されたインデックスにある項目をセッション状態コレクションから削除します。 |
セッション状態オブジェクトは、セッション状態オブジェクトに情報を保存したり、セッション状態オブジェクトから情報を取得したりできる名前と値のペアです。同様に、次のコードを使用できます。
void StoreSessionInfo(){ String fromuser = TextBox1.Text; Session["fromuser"] = fromuser;}void RetrieveSessionInfo(){ String fromuser = Session["fromuser"]; Label1.Text = fromuser;}
上記のコードはセッション ディクショナリ オブジェクトに文字列のみを格納しますが、すべてのプリミティブ データ型と、プリミティブ データ型で構成される配列、DataSet、DataTable、HashTable、Image オブジェクト、およびから継承するユーザー定義オブジェクトを格納できます。 ISerializable オブジェクトの種類。
次の例は、セッション状態の保存の概念を示しています。ページには 2 つのボタンがあります。文字列を入力するテキストボックス ボタンと、最後のセッションで保存されたテキストを表示するラベル ボタンです。タグファイルのコードは次のようになります。
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" > <head runat="server"> <title> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <table> <tr> <td> <asp:Label ID="lblstr" runat="server" Text="Enter a String" > </asp:Label> </td> <td> <asp:TextBox ID="txtstr" runat="server"> </asp:TextBox> </td> </tr> <tr> <td> </td> <td> </td> </tr> <tr> <td> <asp:Button ID="btnnrm" runat="server" Text="No action button" /> </td> <td> <asp:Button ID="btnstr" runat="server" OnClick="btnstr_Click" Text="Submit the String" /> </td> </tr> <tr> <td> </td> <td> </td> </tr> <tr> <td> <asp:Label ID="lblsession" runat="server" > </asp:Label> </td> <td> </td> </tr> <tr> <td> <asp:Label ID="lblshstr" runat="server"> </asp:Label> </td> <td> </td> </tr> </table> </div> </form> </body></html>
デザイン ビューでは次のように表示されるはずです。
バックグラウンドコードは次のとおりです。
public partial class _Default : System.Web.UI.Page { String mystr; protected void Page_Load(object sender, EventArgs e) { this.lblshstr.Text = this.mystr; this.lblsession.Text = (String)this.Session["str"]; } protected void btnstr_Click(object sender, EventArgs e) { this.mystr = this.txtstr.Text; this.Session["str"] = this.txtstr.Text; this.lblshstr.Text = this.mystr; this.lblsession.Text = (String)this.Session["str"]; }}
ファイルを実行し、その動作を確認します。
ASP.NET アプリケーションは、Web サーバー上の単一の仮想ディレクトリ内のすべての Web ページ、コード、およびその他のファイルのコレクションです。情報がアプリケーション状態で保存されると、すべてのユーザーがその情報を利用できるようになります。
アプリケーション状態を使用できるようにするために、ASP.NET は HttpApplicationState クラスからアプリケーションごとにアプリケーション状態オブジェクトを作成し、そのオブジェクトをサーバー メモリに格納します。このオブジェクトは、クラス ファイル global.asax によって表されます。
アプリケーション状態は主に、カウンター、その他の統計、税率や割引率などのすべてのアプリケーション データを保存するため、および Web サイトへのユーザーのパスを保存するために使用されます。
HttpApplicationState クラスには次のプロパティがあります。
財産 | 説明する |
---|---|
アイテム(名前) | 指定された名前のアプリケーション エントリの値。これは HttpApplicationState のデフォルト プロパティです。 |
カウント | アプリケーション状態コレクション内の項目の数。 |
HttpApplicationState クラスには次のメソッドがあります。
方法 | 説明する |
---|---|
Add(名前, 値) | アプリケーション状態コレクションに新しい項目を追加します。 |
クリア | アプリケーション状態コレクションからすべての項目を削除します。 |
(名前) を削除します | 指定された項目をアプリケーション状態コレクションから削除します。 |
すべて削除 | HttpApplicationState コレクション内のすべてのオブジェクトを削除します。 |
削除場所 | インデックスによって見つかったコレクションから HttpApplicationState オブジェクトを削除します。 |
ロック() | 現在のユーザーのみがアクセスできるように、アプリケーション状態コレクションをロックします。 |
ロック解除() | アプリケーション状態コレクションのロックを解除して、すべてのユーザーがアクセスできるようにします。 |
アプリケーションの状態データは通常、イベント用に作成されたハンドラーによって維持されます。
アプリケーションが開きます
申し込み終了
アプリケーションエラー
セッションが開始されます
セッションが終了しました
次のコード スニペットは、アプリケーションの状態情報を保存するための基本的な構文を示しています。
Void Application_Start(object sender, EventArgs e){ Application["startMessage"] = "The application has started.";}Void Application_End(object sender, EventArgs e){ Application["endtMessage"] = "The application has ended.";}