「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>IIS]]

* 目次 [#jef0bbe5]
#contents

*概要 [#j0f3d7b7]
[[ISAPI>#u77f13ce]]と、[[HttpPlatformHandler>#r72bed51]]について。

*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に設定を行う。
[[Web.config>.NET config#u3d1af27]]に設定を行う。

 <?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]]を使用する。)
(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]]


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS