マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。

目次

概要

ISAPI

ISAPIエクステンション

概要

  • DLLとしてIISに直接ロードされるため、オーバーヘッドが少なく高性能・高機能
  • 直接呼び出すこともスクリプトマッピングすることも可能。

開発

以下のインターフェイスを実装(DLLなので以下の関数をエクスポート)

  • GetExtensionVersion?
    DLL の読み込み時に呼び出される。
  • HttpExtensionProc?
    HTTP リクエストを処理する。
  • TerminateExtension?
    DLL のアンロード時に呼び出される。

実行

  • (まだロードされていない場合)DLLをロード。
  • ロード後、IISは、
    • DLLのGetExtensionVersion?メソッドを呼び出す。
    • EXTENSION_CONTROL_BLOCK を作成する。
    • HttpExtensionProc?メソッドの引数にECBのポインタを指定し呼び出す。
  • ISAPI Extension DLLは、ECB を使用して処理を行う。

ECB

  • ECB : Extension Control Block
  • ECB には、如何含まれる含まれる。
  • 基本的なデータブロック
    • QueryString?, Method…
    • データバッファとデータ長等
  • 関数ポインタ
    • GetServerVariable?
    • WriteClient?
    • ReadClient?
    • ServerSupportFunction?

ISAPIフィルタ

概要

  • ISAPIエクステンションと並び、
    IIS の早期のバージョンから実装されている API。
  • 主に、HTTPのフィルタ、書き換え、HTTP 圧縮などを目的としたAPI。

開発

  • 以下のインターフェイスを実装(DLLなので以下の関数をエクスポート)
  • GetFilterVersion?
    DLL の読み込み時に呼び出される。
  • HttpFilterProc?
    通知ごとにそれぞれ特有のデータを受け取る。
    戻り値でフィルターの動作を細かく制御できる。
  • TerminateFilter?
    DLL のアンロード時に呼び出される。
  • ポイント
  • AllocMem?
    • フィルタ内でメモリを割り当てるときは AllocMem? を使う
    • AllocMem? で割り当てたメモリは自動的に解放される
  • pFilterContext?
    • 初期値は NULL
    • ユーザーデータの格納場所
  • SF_STATUS_REQ_READ_NEXT

実行

通知 / 戻り値

  • 通知
    https://msdn.microsoft.com/ja-jp/library/ms524855.aspx
    #通知説明
    1SF_NOTIFY_READ_RAW_DATAクライアントが要求を送信した際。
    2SF_NOTIFY_PREPROC_HEADERS各要求に対して発生。ヘッダーの前処理を完了後に発生。
    3SF_NOTIFY_URL_MAP物理パスに変換しているときに発生。ヘッダーの前処理を完了後、1回以上発生。
    4SF_NOTIFY_AUTHENTICATION匿名リクエスト、authorization headerを含むリクエストの旅に発生。直後、IISはクライアントの認証を試みる。
    5SF_NOTIFY_AUTH_COMPLETE認証完了後に発生。HTTPメソッド、URL、バージョン、ヘッダの表示と変更が可能。
    6SF_NOTIFY_READ_RAW_DATA ※チャンクなどで以降のクライアント・データを受信した際。
    7SF_NOTIFY_SEND_RESPONSE要求が処理され、ヘッダがクライアントに返送される前に発生。
    8SF_NOTIFY_SEND_RAW_DATAクライアントにデータを返信した際。
    9SF_NOTIFY_END_OF_REQUEST各要求の終わりに発生。
    10SF_NOTIFY_LOGIISがログに要求を書き込む直前に発生。
    11SF_NOTIFY_END_OF_NET_SESSIONTCP/IP接続が閉じられると発生

126/5000 HTTP要求が完了し、

  • 戻り値
    #戻り値説明
    1SF_STATUS_REQ_FINISHEDフィルタがHTTP要求を処理しました。 サーバーはセッションを切断する必要があります。
    2SF_STATUS_REQ_FINISHED_KEEP_CONN#1と同じだが、キープアライブの際は切断しない。
    3SF_STATUS_REQ_NEXT_NOTIFICATION通知チェーンの次のフィルタを呼び出す。
    4SF_STATUS_REQ_HANDLED_NOTIFICATIONこのフィルタは通知の処理を完了(次のフィルタを呼び出さない)
    5SF_STATUS_REQ_ERRORエラー発生。GetLastError?でエラーをクライアントに通知。
    6SF_STATUS_REQ_READ_NEXTRaw読み取り通知の場合にのみ有効。

HttpPlatformHandler?

概要

  • ARRに似ているが、
    • リモート・サーバーではなく、特定のアウト・プロセスのみを対象にしている。
      アウト・プロセス(指定された実行ファイルのプロセス)の管理までを行う。
    • プロキシでは無いので、HTTPSトラフィックは全てHTTPにオフロードされて渡される。
  • CGI / FastCGIにも似ているが、
    • FastCGI(NamedPipe? or TCP)に近い用途だが、HTTPを使用する。
    • CGI / FastCGIよりも実用的なパフォーマンスを出せる

設定

HttpHandlerの追加

  • パス指定(基本的には、全てのパス)
  • HTTPメソッドを指定(基本的には、全てのHTTPメソッド)
  • 起動する実行ファイルを指定。

テンプレート

Web.configに設定を行う。

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.webServer>
    <handlers>
      <add name="httpPlatformHandler" path="*" verb="*" modules="httpPlatformHandler" resourceType="Unspecified" />
    </handlers>
    <httpPlatform processPath="startup.bat" arguments="">
      <environmentVariables>
        <environmentVariable name="PORT" value="%HTTP_PLATFORM_PORT%" />
      </environmentVariables>
    </httpPlatform>
  </system.webServer>
</configuration>

設定項目

  • handlers - add要素
  • processPath
    起動する実行ファイル
  • arguments
    実行ファイルに渡されるコマンドライン引数
  • startupTimeLimit?
    起動完了までの最大時間
  • startupRetryCount?
    起動失敗時のリトライ回数
  • requestTimeout HTTPリクエストのタイムアウト時間
  • rapidFailsPerMinute? ラピッドフェール保護されるまでの失敗回数/分
  • stdoutLogEnabled?
    標準出力、標準エラー出力のログ保存
  • stdoutLogFile?
    ログファイルのパス
  • httpPlatform要素
  • environmentVariables - environmentVariable要素
  • ポート番号
  • リモートデバッグ用ポート番号

注意

ASP.NETをホストするワーカープロセスであるw3wp.exeをprocessPathに指定できない模様。
(ASP.NETの中ではHttpPlatformHandler?を使用できないので、潔くHttpHandlerを使用する。)

参考

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

しばやん雑記

関連

HttpHandler

Application Request Routing (ARR)


Tags: :Windows, :IIS


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2018-02-07 (水) 14:00:27 (104d)