ISAPI エクステンション (拡張) 概要
ISAPI エクステンション
CGIのようにHTTPリクエストを処理するアプリケーションを作るために用意された、IIS の組み込み API
DLLとしてIISに直接ロードされるため、オーバーヘッドが少なく高性能・高機能なアプリケーションが作成可能。 ASPやASP.NET等もISAPIエクステンションの一つ
直接呼び出すこともスクリプトマッピングすることも可能
ISAPI Extension DLL の構成
三つの関数をエクスポートする
- GetExtensionVersion: DLL の読み込み時に呼び出される
- HttpExtensionProc: HTTP リクエストを処理する
- TerminateExtension: DLL のアンロード時に呼び出される
ISAPI の処理の流れ
- まだロードされていない場合DLLをロード
- ロードした後 IIS が GetExtensionVersion を呼び出す
- EXTENSION_CONTROL_BLOCK を作成
- HttpExtensionProc を呼び出す。このとき、引数にECBのポインタを渡す。
ECB を経由して様々な情報にアクセスできる。
ECB = Extension Control Block
- IIS が HttpExtensionProc に渡す
- ECB に含まれるもの
- 基本的なデータブロック
- QueryString, Method…
- データバッファとデータ長等
- 関数ポインタ
- GetServerVariable
- WriteClient
- ReadClient
- ServerSupportFunction
- 基本的なデータブロック
サーバー変数の取得
- IIS Server Variables
http://msdn.microsoft.com/library/en-us/iissdk/iis/servervariables.asp - GetServerVariable
- ASP の Request.ServerVariables
データの読み込み ~POSTされたデータがある場合
- ECB のデータバッファは lpbData
- トータルのデータサイズは cbTotalBytes
- ECB から直ちに読み込めるサイズは cbAvailable
もし cbAvailable が cbTotalBytes より小さい場合は ReadClient を利用して残りのデータを読み込まなければならない
非同期読み込み
- 非同期 I/O
- 同期 I/O ~ データが全て読み込まれるまでスレッドをブロックする。
- 非同期 I/O ~ 読み込めるデータがあるときに、コールバックを受けアプリケーションでバッファを処理する。
- 非同期読み込み用 SSF コマンド
- SE_REQ_ASYNC_READ_CLIENT
- コールバック関数の設定
- HSE_REQ_IO_COMPLETION
IIS6.0 以降で追加された機能
- HSE_REQ_EXEC_URL
- Wildcard Application Mapping
- HSE_REQ_REPORT_UNHEALTHY
- HSE_REQ_VECTOR_SEND
- Unicode のサーバー変数
HSE_REQ_EXEC_URL
- SSF コマンドの一つ
- あるExtensionへの要求を ”透過的に” 同じサイトの他のURLへリダイレクトする
- 他のスクリプトを非同期で実行する
- Wildcard Application Mappingでも使用
- HSE_REQ_IO_COMPLETION 呼び出し時に HSE_EXEC_URL_INFO をセット
Wildcard Application Mapping
- アプリケーションの “グローバルインタセプタ”
- RRD 通知を受ける ISAPI Filter の代替
HSE_REQ_REPORT_UNHEALTHY
- SSF コマンドの一つワーカープロセスに対して、健全な状態ではないことをレポートする
- Ping が発生した後、プロセスのシャットダウン時間経過後、プロセスのリサイクルが発生
- OrphanWorkerProcess がTRUE であるとプロセスが残る
- OrphanActionExe を利用し、ダンプを採取する等が可能