「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
ISAPIと、HttpPlatformHandlerについて。
ISAPI †
ISAPIエクステンション †
概要 †
- DLLとしてIISに直接ロードされるため、オーバーヘッドが少なく高性能・高機能
- 直接呼び出すこともスクリプトマッピングすることも可能。
開発 †
以下のインターフェイスを実装(DLLなので以下の関数をエクスポート)
- GetExtensionVersion?
DLL の読み込み時に呼び出される。
- HttpExtensionProc?
HTTP リクエストを処理する。
- TerminateExtension?
DLL のアンロード時に呼び出される。
実行 †
- ロード後、IISは、
- DLLのGetExtensionVersion?メソッドを呼び出す。
- EXTENSION_CONTROL_BLOCK を作成する。
- HttpExtensionProc?メソッドの引数にECBのポインタを指定し呼び出す。
- ISAPI Extension DLLは、ECB を使用して処理を行う。
ECB †
- ECB : Extension Control Block
- 基本的なデータブロック
- QueryString?, Method…
- データバッファとデータ長等
- 関数ポインタ
- GetServerVariable?
- WriteClient?
- ReadClient?
- ServerSupportFunction?
ISAPIフィルタ †
概要 †
- ISAPIエクステンションと並び、
IIS の早期のバージョンから実装されている API。
- 主に、HTTPのフィルタ、書き換え、HTTP 圧縮などを目的としたAPI。
開発 †
- 以下のインターフェイスを実装(DLLなので以下の関数をエクスポート)
- GetFilterVersion?
DLL の読み込み時に呼び出される。
- HttpFilterProc?
通知ごとにそれぞれ特有のデータを受け取る。
戻り値でフィルターの動作を細かく制御できる。
- TerminateFilter?
DLL のアンロード時に呼び出される。
- AllocMem?
- フィルタ内でメモリを割り当てるときは AllocMem? を使う
- AllocMem? で割り当てたメモリは自動的に解放される
実行 †
通知 / 戻り値 †
- 通知
https://msdn.microsoft.com/ja-jp/library/ms524855.aspx
# | 通知 | 説明 |
1 | SF_NOTIFY_READ_RAW_DATA | クライアントが要求を送信した際。 |
2 | SF_NOTIFY_PREPROC_HEADERS | 各要求に対して発生。ヘッダーの前処理を完了後に発生。 |
3 | SF_NOTIFY_URL_MAP | 物理パスに変換しているときに発生。ヘッダーの前処理を完了後、1回以上発生。 |
4 | SF_NOTIFY_AUTHENTICATION | 匿名リクエスト、authorization headerを含むリクエストの旅に発生。直後、IISはクライアントの認証を試みる。 |
5 | SF_NOTIFY_AUTH_COMPLETE | 認証完了後に発生。HTTPメソッド、URL、バージョン、ヘッダの表示と変更が可能。 |
6 | SF_NOTIFY_READ_RAW_DATA ※ | チャンクなどで以降のクライアント・データを受信した際。 |
7 | SF_NOTIFY_SEND_RESPONSE | 要求が処理され、ヘッダがクライアントに返送される前に発生。 |
8 | SF_NOTIFY_SEND_RAW_DATA | クライアントにデータを返信した際。 |
9 | SF_NOTIFY_END_OF_REQUEST | 各要求の終わりに発生。 |
10 | SF_NOTIFY_LOG | IISがログに要求を書き込む直前に発生。 |
11 | SF_NOTIFY_END_OF_NET_SESSION | TCP/IP接続が閉じられると発生 |
126/5000
HTTP要求が完了し、
- 戻り値
# | 戻り値 | 説明 |
1 | SF_STATUS_REQ_FINISHED | フィルタがHTTP要求を処理しました。 サーバーはセッションを切断する必要があります。 |
2 | SF_STATUS_REQ_FINISHED_KEEP_CONN | #1と同じだが、キープアライブの際は切断しない。 |
3 | SF_STATUS_REQ_NEXT_NOTIFICATION | 通知チェーンの次のフィルタを呼び出す。 |
4 | SF_STATUS_REQ_HANDLED_NOTIFICATION | このフィルタは通知の処理を完了(次のフィルタを呼び出さない) |
5 | SF_STATUS_REQ_ERROR | エラー発生。GetLastError?でエラーをクライアントに通知。 |
6 | SF_STATUS_REQ_READ_NEXT | Raw読み取り通知の場合にのみ有効。 |
HttpPlatformHandler? †
概要 †
- ARRに似ているが、
- リモート・サーバーではなく、特定のアウト・プロセスのみを対象にしている。
アウト・プロセス(指定された実行ファイルのプロセス)の管理までを行う。
- プロキシでは無いので、HTTPSトラフィックは全てHTTPにオフロードされて渡される。
- CGI / FastCGIにも似ているが、
- FastCGI(NamedPipe? or TCP)に近い用途だが、HTTPを使用する。
- CGI / FastCGIよりも実用的なパフォーマンスを出せる
設定 †
- パス指定(基本的には、全てのパス)
- 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>
設定項目 †
- arguments
実行ファイルに渡されるコマンドライン引数
- startupTimeLimit?
起動完了までの最大時間
- startupRetryCount?
起動失敗時のリトライ回数
- requestTimeout
HTTPリクエストのタイムアウト時間
- rapidFailsPerMinute?
ラピッドフェール保護されるまでの失敗回数/分
- stdoutLogEnabled?
標準出力、標準エラー出力のログ保存
- environmentVariables - environmentVariable要素
注意 †
ASP.NETをホストするワーカープロセスであるw3wp.exeをprocessPathに指定できない模様。
(ASP.NETの中ではHttpPlatformHandler?を使用できないので、潔くHttpHandlerを使用する。)
参考 †
Web/DB プログラミング徹底解説 †
しばやん雑記 †
関連 †
Tags: :Windows, :IIS