asp.net セッション状態を理解する
著者:Eve Cole
更新時間:2009-07-01 16:44:49
1. セッションステートの機能
HTTP はステートレス プロトコルであるため、一連のリクエストがすべて同じクライアントから送信されているかどうか、あるいは 1 つのブラウザ インスタンスが依然としてページまたはサイトをアクティブに表示しているかどうかさえ、自動的には示されません。そして、ASP.net の組み込みセッション状態関数を使用すると、
1. 単一のブラウザ クライアントからサーバー上の論理アプリケーション セッションへのリクエストを自動的に識別し、分類します。
2. 複数のブラウザ要求にわたって使用できるように、セッション スコープのデータをサーバーに保存します。
3. アプリケーション コードで処理できる適切なセッション存続期間管理イベント (Session_OnStart、Session_OnEnd など) を発生させます。
2. セッションステータスの識別
セッションを作成するとき、サーバーはセッションごとに個別の ID を生成します。識別子は、URL で許可されている ASCII 文字のみを含む 120 ビットの SessionID 文字列で表されます。 SessionID 値は、一意性とランダム性を保証するアルゴリズムを使用して生成されます。一意性を保証する目的は、セッションが競合しないようにすることであり、ランダム性を保証する目的は、悪意のあるユーザーが既存のセッション ID の数を計算するために新しい SessionID を使用できないようにすることです。セッションID。
3. セッション状態の保存方法
セッション状態を保存するには 3 つの方法があります。
1. インプロセス セッション状態モード (Inproc): 新しい Web プログラムを作成すると、インプロセス セッション状態モードがデフォルトで採用されます。これは、誰もがよく使用するモードでもあります。このモードでは、セッション状態は ASP.NET ワーカー プロセスにローカルに保存されるため、これまでのところ、インプロセス セッション状態モードがおそらく最も高速なアクセス オプションです。ただし、セッションに保存されるデータが増えると、Web サーバーが消費するメモリも増え、パフォーマンスが低下するリスクが高まる可能性があります。
2. .NET 状態サーバー モード (StateServer): セッション状態はリモート プロセス (たとえば、aspnet_state.exe という名前の Windows NT サービス) に保存されます。
3. SQL モード (SQLServer): セッション状態は、SQL Server によって管理される専用のデータベース テーブルに保存されます。
.NET ステート サーバー モードと SQL モードは両方とも、アウトプロセス セッション モードと呼ぶことができます。データを保存する場合は、データをシリアル化して外部リポジトリに保存する必要があります。データを読み取る場合は、データを逆シリアル化してコピーする必要があります。ローカル セッション ディクショナリに送信されるため、リクエストにより 15% (プロセス外) ~ 25% (SQL Server) のパフォーマンス低下が発生しました。これは単なる概算であることに注意してください。ただし、アウトプロセス ストレージ シナリオでは、セッション状態がより長く存続し、Microsoft® インターネット インフォメーション サービス (IIS) および ASP.NET の障害から保護されるため、アプリケーションがより強力になります。セッション状態をアプリケーションから分離することにより、既存のアプリケーションを Web ファームおよび Web ガーデン アーキテクチャに簡単に拡張することもできます。さらに、セッション状態は外部プロセスに保存されるため、プロセス ループによる定期的なデータ損失のリスクが本質的に排除されます。
4. セッションステートの設定
セッション状態の構成は、Web.config ファイルの セクションを設定することによって実現されます。以下に、3 つのセッション状態の具体的な設定方法を紹介します。
1. インプロセスモード
インプロセス モードは、デフォルトのセッション状態モードです。インプロセス モードを使用するには、 要素の mode 属性を Inproc に設定します。
インプロセスモードの構成設定例を以下に示します。 http://www.downcodes.com
<構成>
<システム.ウェブ>
<sessionState mode="Inproc"
クッキーレス = "偽"
タイムアウト = "20" />
</セッション状態>
</system.web>
</構成>
2. ステートサーバーモード
状態サーバーを使用するには、まずセッション ストレージに使用されるリモート サーバー上で ASP.NET 状態サービスが実行されていることを確認する必要があります。このサービスは、ASP.NET および Visual Studio .NET とともに次の場所にインストールされます。
システムルートMicrosoft.NETFrameworkversionNumberaspnet_state.exe
次に、アプリケーションの Web.config ファイルで、 要素の mode 属性を StateServer に設定します。最後に、connectionString プロパティを tcpip=serverName:portNumber に設定します。
以下は、ステート サーバー モードの構成設定の例です。
<構成>
<システム.ウェブ>
<sessionState mode="StateServer"
stateConnectionString="tcpip=データサーバー:42424"
クッキーレス = "偽"
タイムアウト = "20" />
</セッション状態>
</system.web>
3. SQLサーバーモード
SQL Server を使用するには、まずセッション状態が保存される SQL Server コンピューター上で InstallSqlState.sql または InstallPersistSqlState.sql を実行します。どちらのスクリプトも、いくつかのストアド プロシージャを含む ASPState という名前のデータベースを作成します。
2 つのスクリプトの違いは、ASPStateTempApplications テーブルと ASPStateTempSessions テーブルが配置される場所です。 InstallSqlState.sql スクリプトはこれらのテーブルを TempDB データベースに追加しますが、コンピュータを再起動するとデータが失われます。代わりに、InstallPersistSqlState.sql スクリプトはこれらのテーブルを APSState データベースに追加します。これにより、コンピューターの再起動後もセッション データが保持されるようになります。
デフォルトでは、両方のスクリプト ファイルは次の場所にインストールされます。
システムルートMicrosoft.NETFrameworkバージョン番号
次に、アプリケーションの Web.config ファイルで、 要素の mode 属性を SQLServer に設定します。最後に、sqlConnectionString プロパティを Integrated Security=SSPI;datasource=serverName; に設定します。
SQL Server モードの構成設定例を以下に示します。
<構成>
<システム.ウェブ>
<sessionState mode="SQLServer"
sqlConnectionString="統合セキュリティ = SSPI;データ ソース = データサーバー;"
クッキーレス = "偽"
タイムアウト = "20" />
</セッション状態>
</system.web>
</構成>
SQL Server モードでは、フェールオーバー クラスターで動作するようにセッション状態を構成することもできます。フェールオーバー クラスターは、別のコンピューター上の SQL Server データベースにセッション データを保存する 2 つ以上の同一の冗長 Web サーバーです。 1 つの Web サーバーに障害が発生した場合、クラスター内の別のサーバーがその作業を引き継ぎ、セッション データを失うことなくリクエストを処理します。
フェールオーバー クラスタリングを構成するには、Web サーバーの Web.config ファイルの 要素を同じ値に設定します。
次に、セッション データが保存されているコンピュータ上の SQL Server データベースを指すように Web サーバーの SQL 接続文字列を設定します。
5. セッション状態へのアクセス
Session コレクションを通じてセッション状態に直接アクセスできます。以前のバージョンの ASP との互換性を保つために、アプリケーション オブジェクトの Session.Contents プロパティを通じてセッション状態にアクセスすることもできます。
次の例は、最初の Web ページの Session コレクションに 2 つの値を書き込み、2 番目の Web ページで Session コレクションを読み取ることを示しています。注: ここではページ コードは省略されています。
最初の Web ページでは、値を Session コレクションに書き込みます
文字列としての dim 名 = "a"
整数としての dim id = "1"
session("name") = 名前
セッション("id") = ID
2 番目の Web ページは、Session コレクションから値を取得します。
dim name as string = session("name")
dim id as integer = session("id")
'セッション状態コレクション内のアイテムの数を取得します
dim i as integer = session.count
インプロセス モードでは、実際のシリアル化と逆シリアル化は発生しないため、オブジェクトはそれぞれのクラスのアクティブなインスタンスとしてセッション状態に格納されることに注意してください。
アウトプロセスセッションモードでは、シリアル化とデシリアライズを使用するため、状況に応じてデータ型を変換する必要があります。
日付値をシリアル化する場合、日付の型は Int64 である必要があります。
6. セッション存続期間管理イベント
セッション存続期間管理イベントには、Session_OnStart イベントと Session_OnEnd イベントの 2 つがあり、Global.asax.VB ファイルで設定できます。
1. Session_OnStart イベント
単一のブラウザ クライアントがサーバーに接続すると、セッションの開始を示す Session_OnStart イベントがトリガーされます。このイベントは、セッションがタイムアウトするか放棄されない限り、以降のブラウジング中にトリガーされなくなります。セッション変数はページがアクセスされる前に設定されるため、Session_OnStart イベントはセッション変数を設定するのに最適なタイミングです。
例: 次の例は、オンラインの人数をカウントするために一般的に使用される Session_OnStart イベント コードです。
Sub Session_Start(オブジェクトとしての ByVal 送信者、EventArgs としての ByVal e)
'イベント発生時、オンラインユーザー数に1を加算します
アプリケーション("ユーザー数") = アプリケーション("ユーザー数") + 1
エンドサブ
2. Session_OnEnd イベント
Session_OnEnd イベントは、セッションが放棄されるかタイムアウトになるときに発生し、イベントの終了を示します。ただし、このイベントは InProc モードでのみサポートされることに注意してください。ユーザーがタイムアウト期間内にある場合は、Web.config ファイルの セクションのタイムアウト属性を使用してタイムアウト期間を指定できます (分単位、デフォルトは 20 分)。
クロック)、Web ページを更新または要求しないと、セッションは終了します。 Session_OnEnd イベントを使用して、クリーンアップ作業を行うことができます。
例: 次の例は、オンラインの人数をカウントするために一般的に使用される Session_OnEnd イベント コードです。
Sub Session_End(オブジェクトとしての ByVal 送信者、EventArgs としての ByVal e)
アプリケーション("ユーザー数") = アプリケーション("ユーザー数") - 1
エンドサブ