「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>IIS]] * 目次 [#jef0bbe5] #contents *概要 [#j0f3d7b7] *ISAPI [#u77f13ce] -主に、CGIの実装に使用されていた。 -現在、「[[クラシックモード>IISの動作モデル#nfd58656]]」の[[動作モデル>IISの動作モデル]]で動作するIISで利用可能。 -現在のIISのデフォルトの[[動作モデル>IISの動作モデル]]は、「[[統合モード>IISの動作モデル#y99df3d8]]」に変わっている。 **ISAPIエクステンション [#g716a198] ***概要 [#q98a044b] -DLLとしてIISに直接ロードされるため、オーバーヘッドが少なく高性能・高機能 -直接呼び出すこともスクリプトマッピングすることも可能。 ***開発 [#x965a210] 以下のインターフェイスを実装(DLLなので以下の関数をエクスポート) -GetExtensionVersion~ DLL の読み込み時に呼び出される。 -HttpExtensionProc~ HTTP リクエストを処理する。 -TerminateExtension~ DLL のアンロード時に呼び出される。 ***実行 [#kecd210e] -(まだロードされていない場合)DLLをロード。 -ロード後、IISは、 --DLLのGetExtensionVersionメソッドを呼び出す。 --EXTENSION_CONTROL_BLOCK を作成する。 --HttpExtensionProcメソッドの引数にECBのポインタを指定し呼び出す。 -ISAPI Extension DLLは、[[ECB>#r04bd4a6]] を使用して処理を行う。 ***ECB [#r04bd4a6] -ECB : Extension Control Block -ECB には、如何含まれる含まれる。 --基本的なデータブロック ---QueryString, Method… ---データバッファとデータ長等 --関数ポインタ ---GetServerVariable ---WriteClient ---ReadClient ---ServerSupportFunction **ISAPIフィルタ [#wc1b7e7f] ***概要 [#r8ea9855] -[[ISAPIエクステンション>#g716a198]]と並び、~ IIS の早期のバージョンから実装されている API。 -主に、HTTPのフィルタ、書き換え、HTTP 圧縮などを目的としたAPI。 ***開発 [#xff5812f] -以下のインターフェイスを実装(DLLなので以下の関数をエクスポート) --GetFilterVersion~ DLL の読み込み時に呼び出される。 --HttpFilterProc~ 通知ごとにそれぞれ特有のデータを受け取る。~ 戻り値でフィルターの動作を細かく制御できる。 --TerminateFilter~ DLL のアンロード時に呼び出される。 -ポイント --AllocMem ---フィルタ内でメモリを割り当てるときは AllocMem を使う ---AllocMem で割り当てたメモリは自動的に解放される --pFilterContext ---初期値は NULL ---ユーザーデータの格納場所 --SF_STATUS_REQ_READ_NEXT ***実行 [#uef253b0] ***通知 / 戻り値 [#e352ec13] -通知~ https://msdn.microsoft.com/ja-jp/library/ms524855.aspx |#|通知|説明|h |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要求が完了し、 -戻り値 |#|戻り値|説明|h |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 [#r72bed51] **概要 [#s935df9f] -「[[統合モード>IISの動作モデル#y99df3d8]]」の[[動作モデル>IISの動作モデル]]で動作する。 -[[ARR>Application Request Routing (ARR)]]に似ているが、 --リモート・サーバーではなく、特定のアウト・プロセスのみを対象にしている。~ アウト・プロセス(指定された実行ファイルのプロセス)の管理までを行う。 --プロキシでは無いので、HTTPSトラフィックは全てHTTPにオフロードされて渡される。 -CGI / FastCGIにも似ているが、 --FastCGI(NamedPipe or TCP)に近い用途だが、HTTPを使用する。 --CGI / FastCGIよりも実用的なパフォーマンスを出せる **設定 [#o8166f02] ***[[HttpHandler>HttpApplication(Global.asax)、HttpModule、HttpHandler#ae794ab7]]の追加 [#v8432981] -パス指定(基本的には、全てのパス) -HTTPメソッドを指定(基本的には、全てのHTTPメソッド) -起動する実行ファイルを指定。 ***テンプレート [#k2bdf75b] 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> ***設定項目 [#n2ec8c67] -handlers - add要素 --processPath~ 起動する実行ファイル --arguments~ 実行ファイルに渡されるコマンドライン引数 --startupTimeLimit~ 起動完了までの最大時間 --startupRetryCount~ 起動失敗時のリトライ回数 --requestTimeout HTTPリクエストのタイムアウト時間 --rapidFailsPerMinute ラピッドフェール保護されるまでの失敗回数/分 --stdoutLogEnabled~ 標準出力、標準エラー出力のログ保存 --stdoutLogFile~ ログファイルのパス -httpPlatform要素 --environmentVariables - environmentVariable要素 ---ポート番号 ---リモートデバッグ用ポート番号 **注意 [#f783fb76] ASP.NETをホストするワーカープロセスであるw3wp.exeをprocessPathに指定できない模様。~ (ASP.NETの中ではHttpPlatformHandlerを使用できないので、潔く[[HttpHandler>HttpApplication(Global.asax)、HttpModule、HttpHandler#ae794ab7]]を使用する。) *参考 [#l4662cc0] -ISAPI - Wikipedia~ https://ja.wikipedia.org/wiki/ISAPI -HttpPlatformHandler を使用する~ https://technet.microsoft.com/ja-jp/library/mt125371.aspx **Web/DB プログラミング徹底解説 [#g852ef3c] -ネイティブコード API を用いた開発~ http://keicode.com/iis/index4.php --ISAPI エクステンション (拡張) 概要~ http://keicode.com/iis/iis-isapi-extension-overview.php --ISAPI フィルタ概要~ http://keicode.com/iis/iis-isapi-filter-overview.php ---ISAPI フィルタによるログの書き換え~ http://keicode.com/iis/isapi-filter-log-change.php ---カスタムの ISAPI Extension を利用する方法 (IIS7 on Windows Vista)~ http://keicode.com/iis/iis02.php **しばやん雑記 [#j73912b4] -httpPlatformHandler をもっと面白く使っていきたい~ http://blog.shibayan.jp/entry/20150107/1420604057 -HttpPlatformHandler が IIS 8 以降の拡張機能として正式にリリースされていました~ http://blog.shibayan.jp/entry/20150128/1422429554 **関連 [#e0f4eea6] ***[[HttpHandler>HttpApplication(Global.asax)、HttpModule、HttpHandler#ae794ab7]] [#a2f6bba2] ***[[Application Request Routing (ARR)]] [#y1d69d6c] ---- Tags: [[:Windows]], [[:IIS]]