「[[マイクロソフト系技術情報 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の動作モデル]]で動作するIISで利用可能。
-現在のIISのデフォルトの[[動作モデル>IISの動作モデル]]は、「統合モード」に変わっている。

**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]
-「統合モード」の[[動作モデル>IISの動作モデル]]で動作する。

*参考 [#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

----
Tags: [[:Windows]], [[:IIS]]

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