ISAPI エクステンション (拡張) 概要

ISAPI エクステンション

CGIのようにHTTPリクエストを処理するアプリケーションを作るために用意された、IIS の組み込み API

DLLとしてIISに直接ロードされるため、オーバーヘッドが少なく高性能・高機能なアプリケーションが作成可能。  ASPやASP.NET等もISAPIエクステンションの一つ

直接呼び出すこともスクリプトマッピングすることも可能

ISAPI Extension DLL の構成

三つの関数をエクスポートする

  1. GetExtensionVersion: DLL の読み込み時に呼び出される
  2. HttpExtensionProc: HTTP リクエストを処理する
  3. TerminateExtension: DLL のアンロード時に呼び出される

ISAPI の処理の流れ

  1. まだロードされていない場合DLLをロード
  2. ロードした後 IIS が GetExtensionVersion を呼び出す
  3. EXTENSION_CONTROL_BLOCK を作成
  4. HttpExtensionProc を呼び出す。このとき、引数にECBのポインタを渡す。
     ECB を経由して様々な情報にアクセスできる。

ECB = Extension Control Block

  • IIS が HttpExtensionProc に渡す
  • ECB に含まれるもの
    • 基本的なデータブロック
      • QueryString, Method…
      • データバッファとデータ長等
    • 関数ポインタ
      • GetServerVariable
      • WriteClient
      • ReadClient
      • ServerSupportFunction

サーバー変数の取得

データの読み込み ~ 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 を利用し、 ダンプを採取する等が可能

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説