IISにおける「セッション管理」
2019 年 9 月 17 日 by umaこんにちは、umaです。
今回は、以前VB.NETでの開発時に起きた、セッション周りでの不具合を忘れぬため。また先輩方にせっかく教えていただいたことをしっかりと残すうえでも、メモ代わりに残します。
Webアプリケーションを実現するHTTPは状態を持たない(ステートレス)なプロトコルです。値を保持するためには、状態をどこかで管理する必要があります。その一つが「セッション管理」です。
IISにおける「セッション管理」
そもそもIISには3つのセッション管理があります。
- InProc(インプロセス)モード
- StateServer(ステートサーバー)モード
- SQL Serverを用いたセッション管理
「3. SQL Serverを用いたセッション管理」はまた別の機会に調べるとして。。。
1.InProc(インプロセスモード)
- IISでのデフォルト設定!
- セッション状態をWebサーバーのインメモリ(※1)で管理
- 高速!(※2)
- プロセスがリサイクルされるたび「セッション状態」は失われる!
※1 インメモリ=ASP.NETのプロセスのメモリ領域 ※2 シリアライズやデシリアライズのオーバーヘッドがない
2.StateServer(ステートサーバー)モード
- 別サービス(つまり別プロセス)でセッション状態を管理
- シリアライズが必要なオブジェクトに関しては、Serializable属性を予め付けておく必要がある
このモードを利用する場合、パフォーマンス低下の要因となる一つが、格納対象となるデータのシリアライズとデシリアライズ。
ASP.NETでは、最適化された内部メソッドを用いることで、幾つかの基本型シリアライズやデシリアライズを行う。基本型としては、Int、Byte、Decimalのようなすべてのサイズの数値型や、String、TimeSpanのようないくつかの非整数型があげられる。
これらの基本型以外の変数がセッション保存される場合は、ASP.NETで「BinaryFormatter」を用いてシリアライズやデシリアライズを行う。これは、内部メソッドに比べて処理が遅くなる。
カスタムクラスをセッション状態に保存したい場合、対象とするクラスに[Serializable]属性を付加するか、ISerializableインターフェースを実装しなければなりません。(今回、ここで不具合があった。。。)
まとめ
今回は、IISセッション管理について3つの明確な違いがある、管理方法についても実装レベルで違いがあるという紹介でした。
それではまた。