.NET TIPS

[ASP.NET]セッション情報を外部プロセスで管理するには?

山田 祥寛
2004/07/16

 ASP.NETにおけるセッション情報は、デフォルトでIISサーバのメモリ内に管理される。つまり、セッション情報にあまりに巨大なデータを持たせてしまうと、サーバ・マシンのメモリが逼迫(ひっぱく)する原因にもなり得るということだ。ASP.NETでアプリケーションを構築する場合には、原則、大量のデータはデータベース・サーバなどに永続化するべきであり、セッション情報にはあくまで限られた少量のデータ、または、データベース・サーバにアクセスするためのキーとなる情報のみを保持するのが好ましい。

 とはいえ、アプリケーションの構造によっては、やむを得ず、対象となるデータが大きくなることはある。また、そもそも利用するユーザー数が増えてくれば、セッション情報が必要とするメモリ量が増えてくるのは否めないだろう。

 そこで、ASP.NETは、セッション情報の多寡がアプリケーションのパフォーマンスの良しあしに直結しないように、ASP.NETとは別のプロセス(または、別のサーバ・マシン上のプロセス)で管理するための手段を提供している。それがASP.NET State Service(以下、State Service)だ。

 State Serviceとは、ASP.NETのセッション管理だけを担うサービスである。これは、従来、IISサーバ内のプロセスで管理されていたセッション管理を専用プロセスに委ねるサービスだ。これにより、以下のようなメリットを得ることができる。

(1)Webサーバへのメモリ負荷を分散できる

 Webサーバとセッション管理サーバを分離できるので、セッション・データの増大がそのままアプリケーションのパフォーマンスを左右することはない。例えば1つのセッション管理サーバで複数のWebサーバを管理しているような場合、ユーザー数が増えても、セッション管理サーバのメモリのみを増設すればよい(つまり、個々のWebサーバのメモリは増設しなくてもよい)ので、より効率的なハードウェア投資が可能となるだろう。

(2)アプリケーションの再起動時にもセッションを維持できる

 ASP.NETでは、以下のような条件下でaspnet_wp.exe、またはWebアプリケーション用のアプリケーション・ドメインは再起動される。

  • global.asax、web.configが更新された場合

  • web.configの<processModel>要素などでプロセスの再起動条件として、requestLimitやmemoryLimitなどの属性値を指定しており、かつ、現在の状態がその条件に合致した場合

  • /binフォルダ内のアセンブリを更新した場合

 また、本来あってはならないことではあるが、アプリケーションの障害などで、運用中にWebサーバを再起動するというようなケースもあり得ない話ではない。

 以上のような場合には、IISプロセスで管理されたセッション情報は破棄されてしまうが、別プロセスでセッション情報を管理していれば、このような心配もない。つまり、Webサーバの状態によらず、セッション情報を保持することができる。

(3)複数サーバでセッションを共有可能

 大規模なアプリケーションを構築する場合、負荷分散のためにWebサーバをクラスタ構成にするというケースはよくあることだ。しかし、従来のIISプロセスによるセッション管理では、異なるWebサーバ間でセッション情報を共有することができなかった。つまり、同一ユーザーからのアクセスは必ず同一のWebサーバで処理しなければならず、必ずしも適切な負荷分散を実現できなかった。しかし、セッション情報を専用のサービスに委ねることで、セッション情報自体は必ず唯一のサーバが管理するので、こうした問題を意識する必要はない。

 ただし、このState Serviceモードは、必ずしもメリットばかりでないことにも留意してほしい。というのも、セッション情報が別プロセスで管理されているということは、セッション・データへの参照/設定に当たって、必ず「外部プロセスへのアクセス」が発生するということになるからだ。この行為は、同一プロセス内へのアクセスに比べると、はるかにオーバーヘッドが大きい。上に挙げたようなState Service利用のメリットが、このオーバーヘッドを上回らないような環境では、無条件にState Serviceを利用するべきではない。

 さて、それではState Serviceを利用するための手順を、以下に示しておこう。State Serviceを利用する方法はごくシンプルだ。

1. State Serviceを起動する

 State Serviceの開始/停止は、[コントロール パネル]−[管理ツール]−[サービス]から行う。[サービス]ダイアログから[ASP.NET State Service]を右クリックし、表示されたコンテキスト・メニューから[開始]をクリックする。

State Serviceの起動
起動には、サービス管理ツールで[ASP.NET State Service]を右クリックし、表示されたコンテキスト・メニューから[開始]をクリックする。

 もし、次回以降、サーバの起動時にState Serviceを自動起動したい場合には、[ASP.NET State Service]のプロパティ・シートから[スタートアップの種類]の項を[自動]とすればよい。これによって、次回のサーバ・マシン起動時からState Serviceは自動起動する。

State Serviceのプロパティ・シート
サービスを自動起動させる場合には、[スタートアップの種類]の項を[自動]とすればよい。

2. State Serviceを有効にする

 次に、IISサーバ側でState Serviceの利用を有効にし、State Serviceのサービスが起動しているサーバを指定する必要がある。これには、web.configの<sessionState>要素を以下のように設定する。なお、<sessionState>要素は、仮想ディレクトリ直下のweb.configでしか設定できない点に注意すること。

<?xml version="1.0" encoding="UTF-8" ?>
<configuration>
  <system.web>
    <sessionState mode="StateServer"
      stateConnectionString="tcpip=127.0.0.1:42424"
      stateNetworkTimeout="10" />
  </system.web>
</configuration>
State Serviceの利用を有効にするためのweb.configの設定

 <sessionState>要素のmode属性では、State Serviceを利用する場合は"StateServer"を指定する。stateConnectionString属性には、State Serviceが起動しているマシンへの接続文字列を指定する。ここでは、仮にWebサーバと同一のマシン上でサービスが稼働しているものと仮定して「127.0.0.1」を指定しているが、この個所は適宜、読者諸兄の環境に合わせて変更してほしい。stateNetworkTimeout属性は、State Serviceサーバへの接続タイムアウト時間を秒単位で指定する。State Serviceサーバの負荷状態が高い場合などには、この値を大きめに設定しておくことで、接続タイムアウトの確率を低くすることができる。

 以上で、State Serviceを利用するための準備は完了だ。State Serviceが正常に動作していることを確認するには、タスク・マネージャから各プロセスのメモリ使用量を確認してみればよい。大量のセッション・データをアプリケーションからセットした場合に、aspnet_state.exeのメモリ使用量が増えていることが確認できるはずだ。

タスク・マネージャでのState Service(aspnet_state.exe)のメモリ使用量の確認

 なお、State Serviceモード(または、SQL Serverモード)のような外部プロセスによるセッション管理を利用した場合、Global.asaxによるSession_OnEndイベントは利用できないので、注意すること。Session_OnEndイベントによるセッションの状態監視が利用できるのは、セッションをインプロセスで管理している場合(デフォルトの状態)に限られる。End of Article

カテゴリ:Webフォーム 処理対象:セッション管理
 
この記事と関連性の高い別の.NET TIPS
[ASP.NET]セッション情報をSQL Server上で管理するには?
[ASP.NET]SQL Serverモードのセッション管理で情報を永続化するには?
[ASP.NET]クッキーをサポートしないクライアントでセッション機能を利用するには?
VS 2005やIISを使用せずにWebアプリケーションを実行するには?
このリストは、(株)デジタルアドバンテージが開発した
自動関連記事探索システム Jigsaw(ジグソー) により自動抽出したものです。
generated by

「.NET TIPS」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間