共用方式為


設計Native-Code HTTP 模組

IIS 7 中的 HTTP 模組可讓開發人員擴充或取代核心 IIS 功能。 例如,您可以撰寫摘要式驗證模組,以取代 IIS 7 隨附的模組。 雖然原生程式碼模組所提供的某些功能可能類似于先前透過 ISAPI 篩選器提供的功能,但原生程式碼模組的設計方式不同,並提供比 ISAPI 篩選器更豐富的功能集。

Native-Code HTTP 模組的需求

新增匯出的註冊函式

需要 HTTP 模組才能匯出 RegisterModule 函式。 您可以為專案建立模組定義 (.def) 檔案,或使用 /EXPORT:RegisterModule 參數編譯模組來匯出此函式。

指定通知和模組優先順序

當您建立函 RegisterModule 式時,您可以指定位元遮罩,其中包含要求層級模組將處理 (的通知清單,以取得詳細資訊,請參閱 要求處理常數) 。 例如,要求層級模組可以指定它會提供方法來處理 RQ_BEGIN_REQUEST 通知和 RQ_MAP_PATH 通知後。 同樣地,全域層級模組也可以指定它會提供方法來處理 GL_APPLICATION_STARTGL_APPLICATION_STOP 通知。

RegisterModule 式也可讓您指定模組的優先順序。 可用的優先順序為 PRIORITY_ALIAS_FIRSTPRIORITY_ALIAS_HIGHPRIORITY_ALIAS_MEDIUMPRIORITY_ALIAS_LOWPRIORITY_ALIAS_LAST 。 註冊模組時,系統會依照優先順序和組態設定的連續處理模組。 例如,如果您建立一個註冊為中優先順序模組的 HTTP 模組,則在處理所有高優先順序模組之前,將不會處理您的模組。 您可以將模組設定為在其他中優先順序模組之前進行處理,而模組將在任何低優先順序模組之前處理。

注意

通知的優先順序層級順序會反轉 RQ_SEND_RESPONSE

建立Request-Level模組

建立模組處理站

原生程式碼要求層級模組必須提供模組處理站,以建立 CHttpModule 類別的實例。 模組處理站會繼承自 IHttpModuleFactory 介面。

如需如何建立模組處理站的詳細資訊,請參閱逐步解說 :使用機器碼建立Request-Level HTTP 模組中的程式碼範例。

建立衍生自 CHttpModule 的類別

要求層級 HTTP 模組的主要處理功能是透過衍生自基 CHttpModule 類的模組來提供。 這個類別必須包含函式中列出的每個通知或後置通知的 RegisterModule 回呼方法。 例如,如果您的模組已註冊 RQ_AUTHENTICATE_REQUEST 通知和 RQ_AUTHORIZE_REQUEST 後通知,您的類別必須包含 OnAuthenticateRequestOnPostAuthorizeRequest 方法。

從 CHttpModule 方法傳回

當 類別中的 CHttpModule 方法完成處理時,每個方法都必須傳回 REQUEST_NOTIFICATION_STATUS 列舉值。 此值決定 IIS 如何處理類別方法的結束條件。 例如,傳回值 RQ_NOTIFICATION_CONTINUE 會通知 IIS 繼續處理要求。 相反地, RQ_NOTIFICATION_FINISH_REQUEST 傳回值會指示 IIS 停止處理目前的要求。

CHttpModule 清除

當模組完成處理時,IIS 會呼叫模組的 CHttpModule::D ispose 方法,以從記憶體中移除 CHttpModule 類別。

建立Global-Level模組

建立衍生自 CGlobalModule 的類別

全域層級 HTTP 模組的主要處理功能是透過衍生自基底 CGlobalModule 類別的模組提供。 這個類別必須包含函式中列出的每個通知的 RegisterModule 回呼方法。 例如,如果您的模組已註冊 GL_APPLICATION_STARTGL_APPLICATION_STOP 通知,您的類別必須包含 OnGlobalApplicationStartOnGlobalApplicationStop 方法。

從 CGlobalModule 方法傳回

當 類別中的 CGlobalModule 方法完成處理時,每個方法都必須傳回 GLOBAL_NOTIFICATION_STATUS 列舉值。 此值決定 IIS 如何處理類別方法的結束條件。 例如,傳回值 GL_NOTIFICATION_CONTINUE 會通知 IIS 繼續處理通知。 相反地, GL_NOTIFICATION_HANDLED 傳回值會指示 IIS 停止處理目前的通知。

CGlobalModule 清除

當模組完成處理時,IIS 會呼叫模組的 CGlobalModule::Terminate 方法。 您的模組應該使用此方法從記憶體中移除您的 CGlobalModule 類別。

另請參閱

逐步解說:使用原生程式碼建立Request-Level HTTP 模組
逐步解說:使用原生程式碼建立Global-Level HTTP 模組
建立 Native-Code HTTP 模組