Open棟梁Project - マイクロソフト系技術情報 Wiki
2層C/Sシステムでは、クライアント側プログラムがDBに直接接続し、状態(UPが処理に必要とする一連の情報(制御情報や業務処理に必要な情報を含む))を一元管理するという方式が採用されている。これに対し3層C/SシステムやWebシステムでは、APサーバの拡張性・信頼性を確保するために、サーバの状態を保持しないで「サーバへのリクエスト」・「クライアントへのレスポンス」の間で必要な情報を持ち回り、サーバがリクエストを受け付けたときサーバ側で状態を復元するという方式が一般化した(一般的に、サーバに状態を保持しないほうが拡張性は高くなる(サーバに状態を保持した場合、信頼性を確保するための冗長化構成が組み難いなどの問題があるため))。しかし、近年のWebシステムにおいては、サーバに状態を保持した場合も拡張性・信頼性を確保するための技術(Session情報をリモート プロセス・リモート サーバなどで一元管理するためのインフラス トラクチャの構築技術)も登場しており、サーバ側のメモリ領域にユーザ毎に確保される「Session」を使用して、状態を保持するケースが多数を占めるようになってきている。このため、3層C/SシステムやWebシステムの「状態管理方式」の大枠は、次の2つの方式に分けることができる。
表1:3層C/SシステムやWebシステムの状態管理方式
項番 | 状態管理方式 | 説明 |
1 | サーバ ステートレス | サーバ側の状態保持領域を利用しない。 |
2 | サーバ ステートフル | サーバ側の状態保持領域を利用する。 |
特にWebシステムの「状態管理方式」は、クライアント側で状態を一元管理することができないため、クライアント側とサーバ側の双方で連携して状態を管理する必要があり、2層・3層C/Sアプリケーションと比べて複雑である。このため、本ドキュメントではWebアプリケーション用のAPサーバであるASP.NETを使用したASP.NETアプリケーションの「状態管理方式」に関する、下記の項目について説明する。
特に、「状態管理方式」の選択や「状態管理技術」の使い方を誤れば、性能の悪化や保守性の悪化、予期せぬセキュリティ問題が発生したり、拡張性・信頼性の要件が満たせないという問題などにも結びついたりするので注意が必要である。
「サーバ ステートレスな状態管理方式」とはWeb・APサーバに状態を持たせない方式であり、必要なデータはDBサーバ上に永続化するか、クライアント・サーバ間でHTTPのリクエスト ⇒ レスポンス ⇒ リクエストと状態を持ち廻る方式である。この場合、サーバはリクエストを処理してレスポンスを返した段階でWeb・APサーバ上のメモリの情報を破棄し、Web・APサーバ上に状態を保持しない。
表:サーバ ステートレスな状態管理方式の処理概要
順番 | 処理の実装箇所 | 処理 | |
クライアント / サーバ | モジュール | ||
1 | クライアント側 | wwwブラウザ | 「サーバ処理1」に対して「ページ1」を要求する。 |
2 | サーバ側 | サーバ処理1 | 「ページ1」のHTMLをクライアントに出力する。 |
3 | クライアント側 | wwwブラウザ ページ1 | 「Form」や「クエリー ストリング」に処理を継続するために必要な情報を含め「サーバ処理2」を要求する。 |
4 | サーバ側 | サーバ処理2,3 | 「サーバ処理2」 ⇒ 「サーバ処理3」と情報を持ち廻る時は、「Form」・「HTTP Context」などに情報を格納した後にサーバ処理を遷移し、「ページ2」のHTMLをクライアントに出力する。 |
「サーバ ステートフルな状態管理方式」とはWeb・APサーバに状態を持たせる方式であり、必要なデータをWeb・APサーバ上のメモリ領域に保持する。
この方式では、Web・APサーバ上のメモリ領域に状態を保持する(主にSessionが使用される)。このため、保持すべきデータをDBサーバ上に永続化したり、クライアント・サーバ間で状態を持ち廻ったりしなくても、画面間で情報を引き継ぐことができる。また、「サーバ ステートレスな状態管理方式」で使用した技術も併用できる。
以下の表に、
表:ASP.NETにおける状態管理技術の説明
項番 | 状態管理技術 | 説明 |
1 | Formデータ | HTTPのメッセージ ボディを使用する。送信時はFormのポストで送信する。受信時はHTMLとして受信する。 |
2 | ViewState? | Hiddenを仕様した状態保持の仕組みだが、ASP.NETの独自の基盤機能が付加されている。 |
3 | Query string | HTTPのリクエストのメッセージ ヘッダーを使用する。 |
4 | Cookie | HTTPのメッセージ ヘッダーを使用する。 |
5 | Server.Transfer+HTTP Context領域 | Server.Transfer処理はサーバ処理を遷移するためのメソッド、HTTP Context領域はリクエスト単位で確保する領域である。 ASP.NET独自の呼称だが、類似した技術が、似たような仕組みは各APサーバにも用意されている。 |
6 | Session | ASP.NETの組込みオブジェクト。Webアプリケーションで一般的に使用されるが、ASP.NETの独自の基盤機能が付加されている。 |
7 | Application | ASP.NETの組込みオブジェクト。アプリケーション単位の共通情報を管理する。 |
8 | 静的変数 | ASP.NETプログラムのグローバル変数。 |
9 | Cache | ASP.NETの組込みオブジェクト。キャッシュ処理用に使用される。 |
表:ASP.NETにおける状態管理技術の特徴
項番 | 状態管理技術 | 区分 | |||
ASP.NET独自 | Webアプリケーション一般 | ステートレス | ステートフル | ||
1 | Formデータ | - | ○ | ○ | - |
2 | ViewState? | ○ | - | ○ | - |
3 | Query string | - | ○ | ○ | - |
4 | Cookie | - | ○ | ○ | - |
5 | Server.Transfer+HTTP Context領域 | - | ○ | ○ | - |
6 | Session | ○ | - | - | ○ |
7 | Application | ○ | - | - | ○ |
8 | 静的変数 | - | ○ | - | ○ |
9 | Cache | ○ | - | - | ○ |
ASP.NETが、今までのWeb開発技術から大きく進化した点に、VB6.0以前のバージョンや.NETのWindowsアプリケーションなどで知られている「イベント ドリブンのプログラミング モデル」が採用された点が挙げられる。この「イベント ドリブンのプログラミング モデル」を可能にしたことで、ASP.NETでは、「同一の画面に対してポストバックする方式」が標準となった。
「同一の画面に対してポストバックする方式」とは、自身を生成した画面(aspx)に対してForm情報をポストする方式のことであり、ASP.NETのアプリケーションは通常、以下のように動作する。
ASP.NETでは、画面上でボタンを押すと自分の画面に対して「Form情報」が「ポストバック」される。サーバ側では、画面上のどのボタンが押されたのかを「Form情報」から自動的に解析し、画面に登録されているイベント ハンドラに自動的に処理を振り分ける。このように、従来の技術と比べASP.NETでは「動的ページ」と「サーバ処理」の関係が、「画面」という単位でわかりやすく対応付くようになった。また、従来の技術では同一画面を再表示する場合、ポストされた「Form情報」をサーバ側で再取得して、再びHTMLの各要素のvalueに設定して出力する必要があったが、ASP.NETのWebコントロール(以下、Webコントロールと略す)では、Webコントロールの情報をサーバ側で復元する処理も自動化されている。
ASP.NET独自のサーバ ステートレスな状態管理技術として「ViewState?」がある。本節では、この「ViewState?」がどの様な技術で実装され、どの様な目的で使用されているかについて説明する。
という実装になっている。
ハッシュ値の付与や、base64エンコードを除けば 、オブジェクトのデータをシリアライズ・デシリアライズし、Hiddenタグを使用して文字列形式で情報を保持しているだけである。このため、「ViewState?」はサーバ ステートレスな状態管理技術に分類できる(設定によっては暗号化も可能であるが、デフォルトの設定では暗号化されないので注意が必要である)。
次項では、「ViewState?」の利用目的の詳細について説明する。
「ViewState?」には、イベント ドリブンのプログラミング モデルを実現するための使用方法が存在する。この用途では、利用者から意図することなく利用される。この用途とは、Webコントロールに関する表示状態の情報をViewState?に保存することで「ポストバック」の際に、
といった用途である。
前項に示した「ViewState?」の使用方法以外には、同一画面内でのみ機能する(画面間を跨った利用は不可能)、サーバ ステートレスな状態管理技術としての使用方法がある。この使用方法では、利用者が必要に応じてアプリケーションに実装する。この使用方法は、独自に「Hiddenタグ」を追加して、そこにシリアル化されたオブジェクト情報を保持する方式と大きな違いは無い。
Webフォームのメンバ変数は、Windowsフォーム内のメンバ変数のように情報を保持しない。また、サーバ ステートレスな状態管理方式を採用している場合、サーバ側のメモリも利用できない。このような場合に「ViewState?」を使用すれば、同一画面内でのみ状態を保持することができる。このため、見方によってはWebフォーム内の情報を保持する機構と解釈することもできる。
また、サーバ ステートフルな状態管理方式を採用している場合、Webフォーム内の情報を保持する処理を「Session」でも代替できるが、「ViewState?」の場合はデータ消去の手間がかからないというメリットがある。