.NETエンタープライズWebアプリケーション 開発技術大全
― エンタープライズWebアプリ開発に必要な知識と設計セオリー ―


Sessionオブジェクト

マイクロソフト コンサルティング本部 赤間 信幸
2004/07/15


.NETエンタープライズWebアプリケーション 開発技術大全

 本記事は、日経BPソフトプレス/マイクロソフトプレスが発行している『.NETエンタープライズWebアプリケーション開発技術大全 Vol.3 ASP.NET 応用編』の「第2章 Webアプリケーションの状態管理」から「2.1 状態管理手法」「2.3 Sessionオブジェクト」を、同社の許可を得てその内容を転載したものです。

 同書はマイクロソフトのコンサルタントが執筆した.NETシステム設計/構築のための技術解説書で、全5巻で構成されています。このうち、第1巻から第3巻までがすでに発売されています(第4巻と第5巻は、2004年秋以降の発行が予定されています)。

  Insider.NETでは、全6回に渡り、.NET開発者にとって特に重要だと思われる個所をこの3巻より抜粋して掲載しています。なお、書籍の詳細については本記事の最後に表記しています。

 最終回にご紹介する「Sessionオブジェクト」は、第3回の「ViewStateオブジェクト
と並び、ASP.NETでプログラミングを行う際には欠かせない重要な機能です。かつ、Sessionオブジェクトで扱う処理はWebアプリケーションの基本構造に関わるため、その処理方式については事前に十分な検討が必要となります。

 本章では、実システムでしばしば問題となるSessionデータの保存場所や、そのサイズなどについて深く掘り下げています。単に取り得る方式を列挙するのではなく、方式選択のための材料と具体的な指標を明確に示しているところが、本書の特筆すべきポイントです。

ご注意:本記事は、前挙の書籍の内容を改訂することなく、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。

 ViewStateオブジェクトによるデータ保存は、ポストバックにおいてセキュリティを要求されない簡易なデータを保存するのに適している。これに対して、画面遷移にまたがってデータを保存したい場合や、セキュリティを要求されるデータを保存したい場合には、Sessionオブジェクトを利用する。

 Sessionオブジェクトを利用した場合、クライアントへは120ビット長のセッションIDがメモリ常駐型クッキーとして発行される。クライアントからのリクエストはこのセッションクッキーにより一意に識別され、サーバ内のセッション状態データと紐付けされることになる(図1)。

図1 Sessionオブジェクトの基本動作

 ViewStateオブジェクトと同様、Sessionオブジェクトへの格納・取り出しのコーディングそのものは非常に容易であるが、実際の利用時には考慮しなければならない点が多数ある。これらについて順番に解説する。

  • Sessionオブジェクトに格納可能なデータ
  • Sessionデータの保存場所と耐障害性
  • Sessionデータのサイズ
  • パーソナライズ、セッション、認証の違いと使い分け
  • セッションクッキーのセキュリティ(セッションハイジャック)
  • 画面遷移制御とアプリケーションコントローラ

1 Sessionオブジェクトに格納可能なデータ

 Sessionオブジェクトに格納可能なデータは、後述するデータの保存場所によって変化する。しかしいかなる場合にも、Sessionオブジェクトには、シリアル化可能なオブジェクトやデータ以外は格納しないように設計・実装を行うことが望ましい※1。具体的には、以下のようなものに限ってSessionオブジェクトに格納する。

※1 もともとWebアプリケーションは、サーバに状態を残さないように動作するのが基本である(例えばWebページインスタンスが毎回破棄されるなど)。しかし、全くサーバ側に状態を残せないとアプリケーション開発が極めて不便になるため、必要最小限のデータを残しておくことができるようにSessionオブジェクトが用意されている。よって、Sessionオブジェクトに格納するものは最小限に留めるべきで、DataSetのようなシリアル化が可能で「値を持つ」ことを主眼としたデータやオブジェクトに限って格納することが望ましい。
  • 基本データ型(string, int, long, byte, char, decimal, double, float, boolなど)およびその静的配列
  • DataSetおよび型付きDataSet

 逆に、コネクションオブジェクトやWebコントロールなどの部品はSessionオブジェクトに格納してはならない(ViewStateオブジェクトに格納可能なデータ型と同じだと考えればよい)。

 また、Sessionオブジェクトにデータを格納する場合には「どのページで利用されているデータなのか」が分かるようなキー名称を付与することが望ましい。

2 Sessionデータの保存場所と耐障害性(ステートサービスとステートデータベース)

 ASP.NETでは、Sessionデータを別サーバあるいはSQL Server上に保存することが可能になっている。図2のように、セッション情報を外部サーバ上に保持するように構成すれば、障害や振り分け等によって2回目のリクエストが別サーバで処理されても、セッション情報消失の問題が発生しなくなる※2

※2 なおJ2EE系のアプリケーションサーバ製品では、セッションデータを必要に応じてサーバ間でメモリ複製したり、他サーバのセッションデータをオンデマンドで読み出したりするものもあるが、いずれの方式にも性能や耐障害性の面でトレードオフがある。Webサーバをクラスタリングする際にはセッションデータの保持方法が必ず問題になるので、J2EEでは実製品のスペックや性能について詳細に調査し、インフラ構成要件(負荷分散方式やフェイルオーバ時の引継ぎ要件)を満たせるか否かを確認しなければならない。

図2 ステートサービスやステートデータベースの利用によるセッション情報の維持

 このようなWebサーバの動作をステートレスな動作と呼ぶ。Webサーバ上に直接データを持つ(=ステートフル)と各種の問題が発生するが、Webサーバ上に直接データを持たないようにする(=ステートレス)とこれらの問題をクリアすることができる※3、というわけである。

※3 この「ステートレス」という考え方はセッション状態に限らず、アプリケーションの設計上非常に重要なコンセプトであるので是非心に留めておいて頂きたい。本書でも様々なところでこのコンセプトが出てくる。

 以下に、ステートデータベースとステートサービスに関する、利用方法と注意点を整理する。

A. ステートサービスとステートデータベースのセットアップ

 Session情報を外部に格納するためには、事前にステートサービスあるいはステートデータベースのセットアップ作業が必要になる。

 まず、ステートサービスに関しては、.NET Frameworkのセットアップにより自動的にインストールされるので、これをそのまま利用すればよい。ただし、図3のようにデフォルト状態では手動起動となっているため、自動起動などに変更してサービスを開始しておく必要がある。

図3 ステートサービスのデフォルトの設定画面

 一方、ステートデータベースは、SQL Server上でインストールスクリプトを実行すると作成できる。C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705フォルダ※4に配置されているInstallSqlState.sqlスクリプトを、クエリアナライザやisql.exeコマンドツールなどにより実行する。これにより、Session情報を格納するためのテーブルやストアドプロシージャを、SQL Server上に作成できる。この作業により、ASPStateデータベースが新規生成される(図4)。

※4 .NET Framework 1.1の場合にはv1.1.4322フォルダになる。
 
図4 生成されたASPStateデータベース

B. ステートサービスおよびステートデータベースの利用の指定

 web.config構成ファイル中の<sessionState>セクションを書き換えることによって実施する。リスト1はステートサービスを利用する場合の構成例である※5

※5 なお、ステートデータベースを利用する場合には、SQL Serverへの接続文字列情報を暗号化することが望ましい。詳細と暗号化の方法は、本書の「第5章 ASP.NET Webアプリケーションの構成管理」にて解説する。
 
<configuration>
   <system.web>
       <sessionState
          mode="StateServer"
          stateConnectionString="tcpip=myStateServer:42424"
          cookieless="false"
          timeout="20"
       />
   </system.web>
</configuration>
リスト1 ステートサービスを利用する場合のweb.config構成ファイル例
 
 

 INDEX
  .NETエンタープライズWebアプリケーション 開発技術大全
  Sessionオブジェクト
  1.Sessionオブジェクトに格納可能なデータ
    2.Sessionデータの保存場所と耐障害性(ステートサービスとステートデータベース)
    3.Sessionデータのサイズ(1)
    4.Sessionデータのサイズ(2)
    5.パーソナライズ、セッション、認証済みアクセスの違いと使い分け
    6.画面遷移制御とアプリケーションコントローラ(1)
    7.画面遷移制御とアプリケーションコントローラ(2)
 
インデックス・ページヘ  「.NETエンタープライズWebアプリケーション開発技術大全」


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 記事ランキング

本日 月間