セッション状態モード

更新 : 2007 年 11 月

ASP.NET セッション状態は、セッション データのさまざまなストレージ オプションをサポートします。各オプションは、SessionStateMode 列挙型の値で識別されます。利用可能なセッション状態モードの一覧を次に示します。

  • InProc モードでは、セッション状態が Web サーバーのメモリに格納されます。これは、既定の設定です。

  • StateServer モードは、ASP.NET 状態サービスという個別のプロセスにセッション状態を格納します。これにより、Web アプリケーションを再起動した場合にセッション状態が確実に保護され、また Web ファームの複数の Web サーバーでセッション状態が利用可能になります。

  • SQLServer モードは、セッション状態を SQL Server データベースに格納します。これにより、Web アプリケーションを再起動した場合にセッション状態が確実に保護され、また Web ファームの複数の Web サーバーでセッション状態が利用可能になります。

  • Custom モードでは、カスタム ストレージ プロバイダを指定できます。

  • Off モードは、セッション状態を無効にします。

ASP.NET セッション状態で使用するモードを指定するには、アプリケーションの Web.config ファイルで、sessionState 要素の mode 属性に SessionStateMode 列挙値を指定します。InProcOff 以外のモードでは、このトピックの後半で説明する接続文字列値などの追加のパラメータが必要です。現在選択されているセッション状態を参照するには、HttpSessionState.Mode プロパティの値にアクセスします。

インプロセス モードは既定のセッション状態モードで、InProc SessionStateMode 列挙値を使用して指定されます。インプロセス モードでは、セッション状態の値と変数がローカル Web サーバーのメモリに格納されます。これは、Session_OnEnd イベントをサポートする唯一のモードです。Session_OnEnd イベントの詳細については、「セッション状態イベント」を参照してください。

ms178586.alert_caution(ja-jp,VS.100).gif注意 :

アプリケーションの Web.config ファイルの processModel 要素で webGarden 属性に true を設定して Web ガーデン モードを有効にしている場合は、InProc セッション状態モードを使用しないでください。このモードを使用すると、同じセッションに対する要求がそれぞれ異なるワーカー プロセスによって処理される場合、データ消失が発生する可能性があります。

StateServer モードは、ASP.NET ワーカー プロセスまたは IIS アプリケーション プールとは異なるプロセスにセッション状態を格納します。これは ASP.NET 状態サービスと呼ばれます。このモードにより、Web アプリケーションを再起動した場合にセッション状態が確実に保護され、また Web ファームの複数の Web サーバーでセッション状態が利用可能になります。

StateServer モードを使用するには、まず、ASP.NET 状態サービスが、セッション ストアとして使用されるサーバーで実行されていることを確認する必要があります。ASP.NET 状態サービスは、ASP.NET と .NET Framework のインストール時にサービスとしてインストールされます。ASP.NET 状態サービスは、次の場所にインストールされます。

systemroot\Microsoft.NET\Framework\versionNumber\aspnet_state.exe

StateServer モードを使用するように ASP.NET アプリケーションを構成するには、アプリケーションの Web.config ファイルを次のように編集します。

次の例は、セッション状態が SampleStateServer という名前のリモート コンピュータに格納される StateServer モードの構成設定例です。

<configuration>
  <system.web>
    <sessionState mode="StateServer"
      stateConnectionString="tcpip=SampleStateServer:42424"
      cookieless="false"
      timeout="20"/>
  </system.web>
</configuration>
ms178586.alert_note(ja-jp,VS.100).gifメモ :

モードが StateServer に設定されている場合、セッション状態に格納されるオブジェクトはシリアル化が可能である必要があります。シリアル化可能なオブジェクトについては、「SerializableAttribute クラス」を参照してください。

Web ファームで StateServer モードを使用するには、Web ファームに含まれるすべてのアプリケーションに対する Web 構成の machineKey 要素に、同じ暗号キーを指定する必要があります。コンピュータ キーの作成方法については、Microsoft サポート技術情報 (http://support.microsoft.com) の文書 313091「How to create keys by using Visual Basic .NET for use in Forms authentication」を参照してください。

SQLServer モードは、セッション状態を SQL Server データベースに格納します。このモードにより、Web アプリケーションを再起動した場合にセッション状態が確実に保護され、また Web ファームの複数の Web サーバーでセッション状態が利用可能になります。

ms178586.alert_note(ja-jp,VS.100).gifメモ :

モードが SQL Server の場合、セッション状態に格納されるオブジェクトはシリアル化が可能である必要があります。シリアル化可能なオブジェクトについては、「SerializableAttribute クラス」を参照してください。

SQLServer モードを使用するには、まず、ASP.NET セッション状態データベースが SQL Server 上にインストールされていることを確認する必要があります。ASP.NET セッション状態データベースは、このトピックの後半で説明する Aspnet_regsql.exe ツールを使用してインストールできます。

SQLServer モードを使用するように ASP.NET アプリケーションを構成するには、アプリケーションの Web.config ファイルを次のように編集します。

  • sessionState 要素の mode 属性を SQLServer に設定します。

  • sqlConnectionString 属性を SQL Server データベースの接続文字列に設定します。

    ms178586.alert_note(ja-jp,VS.100).gifメモ :

    SQLServer モード使用時のアプリケーションのセキュリティを向上するために、構成ファイルの sessionState セクションを暗号化し、sqlConnectionString 値を保護することをお勧めします。詳細については、「保護された構成を使用した構成情報の暗号化」を参照してください。

次の例は、セッション状態が "SampleSqlServer" という名前の SQL Server に格納される SQLServer モードの構成設定例です。

<configuration>
  <system.web>
    <sessionState mode="SQLServer"
      sqlConnectionString="Integrated Security=SSPI;data 
        source=SampleSqlServer;" />
  </system.web>
</configuration>
ms178586.alert_note(ja-jp,VS.100).gifメモ :

構成ファイルで sessionState 要素の sqlConnectionString 属性を使用して SQL Server への信頼された接続を指定すると、SessionStateModule は SQL Server 統合セキュリティを使用して SQL Server に接続します。この接続は、ASP.NET プロセス ID、または identity 構成要素にユーザー資格情報が指定されている場合はその情報を使用して構築されます。IIS の偽装された ID を代わりに使用するように指定するには、<identity impersonate="true" /> を指定し、sessionState 構成要素の useHostingIdentity 属性に false を設定します。ASP.NET プロセス ID の詳細については、「ASP.NET プロセス ID の構成」および「ASP.NET の偽装」を参照してください。

Web ファームに対して SQLServer モードを構成するには、各 Web サーバーの構成ファイルで、sessionState 要素の sqlConnectionString 属性を、同じ SQL Server データベースを指すように設定します。IIS メタベース内の ASP.NET アプリケーションのパスは、セッション状態をその SQL Server データベースで共有するすべての Web サーバーで同一にする必要があります。サーバー間でアプリケーション パスが異なる場合に発生する問題を解決する手順については、Microsoft サポート技術情報 (http://support.microsoft.com) の文書 325056「PRB: Session State Is Lost in Web Farm If You Use SqlServer or StateServer Session Mode」を参照してください。

Aspnet_regsql.exe ツールを使用したセッション状態データベースのインストール

セッション状態データベースを SQL Server にインストールするには、Aspnet_regsql.exe ツールを実行します。このツールは、Web サーバーの systemroot\Microsoft.NET\Framework\versionNumber フォルダにあります。コマンドに次の情報を指定します。

  • SQL Server インスタンスの名前。-S オプションを使用します。

  • SQL Server にデータベースを作成できる権限を持つアカウントのログオン資格情報。-E オプションを使用して、現在ログオンしているユーザーを使用するか、-U オプションでユーザー ID を指定し、-P オプションでパスワードを指定します。

  • セッション状態データベースを追加するための -ssadd コマンド ライン オプション。

    既定では、Aspnet_regsql.exe ツールを使用して、SQL Server Express Edition にセッション状態データベースをインストールすることはできません。Aspnet_regsql.exe ツールを実行して SQL Server Express Edition データベースをインストールするには、まず、次のような T-SQL コマンドを使用して Agent XPs SQL Server オプションを有効にする必要があります。

    EXECUTE sp_configure 'show advanced options', 1
    RECONFIGURE WITH OVERRIDE
    GO
    
    EXECUTE sp_configure 'Agent XPs', 1
    RECONFIGURE WITH OVERRIDE
    GO
    
    EXECUTE sp_configure 'show advanced options', 0
    RECONFIGURE WITH OVERRIDE
    GO
    

    Agent XPs オプションが無効になっている SQL Server Express Edition のすべてのインスタンスに対してこの T-SQL コマンドを実行する必要があります。

既定では、Aspnet_regsql.exe ツールは、SQLServer モードをサポートするストアド プロシージャを含む ASPState という名前のデータベースを作成します。セッション データ自身は、既定では tempdb データベースに格納されます。-sstype オプションを使用すると、セッション データのストレージの場所を変更できます。-sstype オプションとして使用できる値を次の表に示します。

オプション

説明

t

セッション データを SQL Server tempdb データベースに格納します。これは、既定の設定です。セッション データを tempdb データベースに格納した場合、SQL Server を再起動するとセッション データは失われます。

p

セッション データを tempdb データベースではなく、ASPState データベースに格納します。

c

セッション データをカスタム データベースに格納します。c オプションを指定する場合は、-d オプションを使用してカスタム データベースの名前も指定する必要があります。

たとえば、次のコマンドは、"SampleSqlServer" という SQL Server に ASPState という名前のデータベースを作成し、セッション データが ASPState データベースに格納されるようにします。

aspnet_regsql.exe -S SampleSqlServer -E -ssadd -sstype p

ms178586.alert_note(ja-jp,VS.100).gifメモ :

ASP.NET 1.0 または ASP.NET 1.1 を実行している場合、ASP.NET を構成してセッション状態を永続的な SQL Server データベースに格納するために、Aspnet_regsql.exe ツールは使用できません。ただし、永続的なデータベースにセッション状態を格納するためのスクリプトを取得できます。詳細については、http://support.microsoft.com にある Microsoft サポート技術情報の文書 311209「[HOWTO] ASP.NET で永続的な SQL Server セッション状態管理を構成する方法」を参照してください。または、ASP.NET 1.0 または ASP.NET 1.1 を実行する Web サーバーの場合、ASP.NET 2.0 セッション状態スキーマがインストールされている SQL Server にセッション状態を直接保存できます。

SQLServer モードでは、SQL Server を実行する複数のコンピュータをフェールオーバー クラスタとして構成できます。このクラスタは、1 つのデータベースに対するデータを格納する SQL Server を実行する 2 台以上の同一のコンピュータで構成されます。SQL Server を実行しているコンピュータの 1 台に障害が発生した場合は、クラスタ内の別のサーバーが引き継いで、セッション データを失わずに要求を処理します。フェールオーバー クラスタ用の SQL Server モードを設定するには、セッション状態データを tempdb データベースではなく、ASPState データベースに格納するために、Aspnet_regsql.exe ツールの実行時に -sstype p を指定する必要があります。tempdb データベースへのセッション状態の格納は、SQL Server クラスタではサポートされません。フェールオーバー クラスタ用の SQL Server モードを設定する方法については、Microsoft サポート技術情報 (http://support.microsoft.com) の文書 323262「How to use ASP.NET session state SQL Server Mode in a failover cluste」を参照してください。

Custom モードは、カスタム セッション状態ストア プロバイダを使用してセッション状態データを格納することを指定します。ModeCustom の ASP.NET アプリケーションを構成するときは、sessionState 構成要素の providers サブ要素を使用して、セッション状態ストア プロバイダの種類を指定する必要があります。add サブ要素を使用してプロバイダの種類を指定し、プロバイダの種類名を指定する type 属性とプロバイダのインスタンス名を指定する name 属性の両方を含めます。これで、プロバイダ インスタンスの名前が、sessionState 要素の customProvider 属性に提供され、ASP.NET セッション状態がそのプロバイダ インスタンスを使用してセッション データを格納および取得するように構成されます。

ASP.NET セッション状態がカスタムセッション状態ストア プロバイダを使用するように指定する Web.config ファイルの要素の例を次に示します。

<configuration>
  <connectionStrings>
    <add name="OdbcSessionServices" 
      connectionString="DSN=SessionState;" />
  </connectionStrings>

  <system.web>
    <sessionState 
      mode="Custom"
      customProvider="OdbcSessionProvider">
      <providers>
        <add name="OdbcSessionProvider"
          type="Samples.AspNet.Session.OdbcSessionStateStore"
          connectionStringName="OdbcSessionServices" 
          writeExceptionsToEventLog="false" />
      </providers>
    </sessionState>
  </system.web>
</configuration>

カスタム セッション状態ストア プロバイダの詳細については、「セッション状態ストア プロバイダの実装」を参照してください。

ms178586.alert_note(ja-jp,VS.100).gifメモ :

カスタム セッション状態ストア プロバイダは、ASP.NET プロセス ID、または identity 構成要素にユーザー資格情報が指定されている場合はその情報を使用して、セキュリティで保護されたリソース (SQL Server など) にアクセスします。IIS の偽装された ID を代わりに使用するように指定するには、<identity impersonate="true" /> を指定し、sessionState 構成要素の useHostingIdentity 属性に false を設定します。ASP.NET プロセス ID の詳細については、「ASP.NET プロセス ID の構成」および「ASP.NET の偽装」を参照してください。

コミュニティの追加

追加
表示: