.NET開発時に頭が痛くなるSESSIONタイムアウト

3285 ワード

前言


みんなが使っているのを知らない.NETのSESSIONの時に変な問題に遭遇したことがあるかどうか、時々何が起こっているのか分からないが、このSESSIONは理由もなく紛失したのにどうして理解できないのか、SESSIONが信頼できると言っているのではないでしょうか.この問題はよく反省して、私たちがどこかに設置したときに問題があったのか、それともASP.NETのSEESIONは思ったほど信頼性がありません.

セッションタイムアウト値の設定


Webでconfプロファイルの下に書く:
<system.web>
<sessionState mode="InProc" timeout="10"/>
</system.web>

sessionStateには4つのモードoff,inProc,StateServer,SqlServerがあります.

1、offモード


文字通りこれがクローズモードであることがわかりますが、現在のページにsessionの値が必要でない場合は、サーバリソースを減らすためにSessionのオーバーヘッドを取り除くことができます.
またはページ
<%@Page EnableSessionState="false"%>でセッションを閉じます.

2、inProcモード(デフォルトモード)


「Cookieなし」のセッションと、サーバの外にセッションデータを格納できます.ASP.NETセッションステータスモジュールはWeb.configファイルでは、次のように構成されています.
この例ではmode属性をInProc(デフォルト値)とし、セッションの状態がASPであることを示す.NETはメモリに格納され、CookieでセッションIDを渡す必要はありません.この方法では、Cookieもフォームフィールドを非表示にしても使用できません.したがって,ウェブページにフォームが使用されていなくてもセッションに参加できる.しかし、この方法では、アプリケーションの状態はASPに依存する.NETプロセスは、IISプロセスがクラッシュしたり、正常に再起動したりすると、プロセスに保存されている状態が失われます.

3、StateServerセッション管理


modeプロパティをStateServerに設定します.つまり、セッションデータを別のメモリバッファに格納し、別のマシンで実行します.
のWindowsサービスでこのバッファを制御します.ステータスサービスは「ASP.NET State Service」(aspnet_state.exe)と呼ばれ、コンピュータ管理-サービスに表示され、サービスを開始します.
Web.configファイルのstateConnectionsStringプロパティで構成します.このプロパティは、サービスが存在するサーバと、監視するポートを指定します.
この例では、ステータスサービスはmyserverというマシンの42424ポート(デフォルトポート)で実行されます.サーバ上でポートを変更するには、HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\aspnet_stat \Parametersレジストリ・アイテムのPort値を編集します.
明らかに、ステータスサービスを使用する利点は、プロセスが分離され、Web farm(Webサイト群)で共有できることである.このモードでは、セッションステータスのストレージはiisプロセスの失敗や再起動に依存しませんが、ステータスサービスが中止されると、すべてのセッションデータが失われます.すなわち、ステータスサービスはSQLサーバのようにデータを永続的に格納することはできない.メモリにデータを格納するだけです.

4、SQL Serverによるセッション管理


ASP.NETでは、mode属性をSqlServerに変更することで、セッションデータをデータベース・サーバに格納することもできます.この場合、ASP.NETは、sqlConnectionsStringプロパティ(データ・ソースおよびログイン・サーバに必要なセキュリティ証明書を含む)で指定されたSQLサーバにセッション・データを格納しようとします.
適切なデータベース・オブジェクトでSQL erverを構成するには、管理者がASPStateデータベースを作成する必要があります.
  • WinDir\Microsoft.NetFrameworkVersionフォルダのInstallSqlState.sqlスクリプト(WinDirはサーバのWindowsフォルダであり、Versionはあなたが使用している.NETフレームワークバージョンのインストールフォルダです).

  • SQLサーバを構成するには、SQL Serverが提供するコマンドラインツールosql.exeosql -S [ server name] -U [user] -P [password] -i InstallSqlState.sql、例えばosql-S(local)NetSDK-Usa-P"-i InstallSqlStateをコマンドラインで実行できます.sql
    ここでユーザ名は、SQLサーバ上のsaアカウント、または同等の権限を持つ他のアカウントでなければなりません.興味のある読者はこのスクリプトファイルを開いてASPを知ることができます.NETはどのようにSQL Serverと協力して状態管理を実現したのか.
    これらのテーブルとストレージ・プロシージャをアンインストールするには、UninstallSqlStateを使用します.sqlスクリプトは、上記と同様の使用方法です.必要なデータベースの準備ができたら、web.configファイルのsessionstate要素のmodeをsqlserverに変更し、SQL接続文字列を指定します.具体的には以下の通りです.
    mode="sqlserver"
    sqlConnectionString="data source=127.0.0.1; userid=sa; password="

    SQL Serverを構成すると、アプリケーションコードの実行時にInProcモードと変わらない.ただし、ローカルメモリにデータが格納されていないため、セッションステータスを格納するオブジェクトは、ネットワークを介してデータベース・サーバに転送され、データベース・サーバから転送されるようにシーケンス化および逆シーケンス化される必要があります.これはもちろん性能に影響します.セッションステータスをデータベースに格納することで、拡張性と信頼性のそれぞれに対してパフォーマンスを効率的にバランスさせることができます.また、SQLサーバのクラスタを利用して、ステータスストレージを単一のSQLサーバに依存させないようにすることで、アプリケーションに最大限の信頼性を提供できます.