共用方式為


HTTP 處理常式和 HTTP 模組概觀

更新:2007 年 11 月

ASP.NET HTTP 處理常式是為了回應對 ASP.NET Web 應用程式所提出之要求而執行的處理序 (通常稱為「端點」)。最普通的處理常式是處理 .aspx 檔案的 ASP.NET 網頁處理常式。當使用者要求 .aspx 檔案時,網頁會透過網頁處理常式處理要求。您可以建立自己的 HTTP 處理常式,在瀏覽器中呈現自訂輸出。

HTTP 模組是一個每次在應用程式收到要求時就會被呼叫的組件。HTTP 模組是用來做為 ASP.NET 要求管線的一部分而呼叫,並在整個要求中都有對生命週期事件的存取權。HTTP 模組可讓您檢查連入與連出要求,並根據要求採取動作。

這個主題包含:

  • 案例

  • HTTP 處理常式和 HTTP 模組功能

  • 背景

  • 程式碼範例

  • 類別參考

案例

傳統的自訂 HTTP 處理常式用法包含下列各項:

  • RSS 饋送 (RSS Feed):若要為網站建立 RSS 餽送,您可以建立會發出 RSS 格式之 XML 的處理常式。接著可以將 .rss 之類的副檔名繫結至自訂處理常式。當使用者傳送至網站的要求是以 .rss 結束時,ASP.NET 會呼叫您的處理常式以處理此要求。

  • 影像伺服器:如果您要 Web 應用程式服務各種大小的影像,可以撰寫自訂處理常式以調整影像大小,然後將影像當做處理常式的回應傳送給使用者。

傳統的 HTTP 模組用法包含下列各項:

  • 安全性:因為您可以檢查連入要求,所以在呼叫要求的網頁、XML Web Service 或處理常式之前,HTTP 模組可執行自訂的驗證或其他安全性檢查。在整合模式中執行的 Internet Information Services (IIS) 7.0 裡,您可以將表單驗證擴充至應用程式中的所有內容類型。

  • 統計資料和記錄:因為會針對每個要求而呼叫 HTTP 模組,所以您可將要求統計資料和記錄資訊收集至集中式模組,而不是個別頁面中。

  • 自訂的頁首或頁尾:因為您可以修改連出的回應,所以能將自訂頁首資訊這類的內容插入每個網頁或 XML Web Service 回應中。

回到頁首

功能

HTTP 處理常式和模組功能包含下列各項:

  • IHttpHandlerIHttpModule 介面可做為開發處理常式和模組的起點。

  • IHttpAsyncHandler 介面可做為開發非同步處理常式的起點。

  • 自訂處理常式和模組原始程式碼可以放置在應用程式的 App_Code 資料夾中,或者加以編譯並放置到應用程式的 Bin 資料夾中。

  • 您只需支付少許費用甚至免費,便能在 IIS 7.0 中使用已開發並運用於 IIS 6.0 的處理常式與模組。如需詳細資訊,請參閱將 ASP.NET 應用程式從 IIS 6.0 移至 IIS 7.0

  • 模組可訂閱各種不同的要求管線告知。模組可以接收 HttpApplication 物件的事件告知。

  • 在 IIS 7.0 中,要求管線會與 Web 伺服器要求管線整合,而 HTTP 模組則可以運用在任何對 Web 伺服器的要求上,而不只是針對 ASP.NET 要求。

回到頁首

背景

HTTP 處理常式

ASP.NET HTTP 處理常式是為了回應對 ASP.NET Web 應用程式所提出之要求而執行的處理序。最普通的處理常式是處理 .aspx 檔案的 ASP.NET 網頁處理常式。當使用者要求 .aspx 檔案時,會透過網頁處理常式處理要求。

ASP.NET 網頁處理常式僅有一種處理常式型別。ASP.NET 包含數個其他內建的處理常式,例如 .asmx 檔的 Web 服務處理常式。

ASP.NET 中的內建 HTTP 處理常式

ASP.NET 會根據檔案的副檔名,將 HTTP 要求對應到 HTTP 處理常式。所有 HTTP 處理常式都可處理應用程式中個別 HTTP URL 或 URL 群組的擴充功能。ASP.NET 包括數個內建的 HTTP 處理常式,如下表所列。

處理常式

描述

ASP.NET 網頁處理常式 (*.aspx)

所有 ASP.NET 網頁的預設 HTTP 處理常式。

Web 服務處理常式 (*.asmx)

在 ASP.NET 中建立為 .asmx 檔案之 Web 服務網頁的預設 HTTP 處理常式。

泛型 Web 處理常式 (*.ashx)

所有不包含 UI,但包含 @ WebHandler 指示詞之 Web 處理常式的預設 HTTP 處理常式。

追蹤處理常式 (trace.axd)

顯示目前頁面追蹤資訊的處理常式。如需詳細資訊,請參閱 HOW TO:使用追蹤檢視器檢視 ASP.NET 追蹤資訊

建立自訂 HTTP 處理常式

若要建立自訂 HTTP 處理常式,請先建立可實作 IHttpHandler 介面以建立同步處理常式的類別。或者,您也可以實作 IHttpAsyncHandler 以建立非同步處理常式。這兩個處理常式介面都需要您實作 IsReusable 屬性和 ProcessRequest 方法。IsReusable 屬性會指定 IHttpHandlerFactory 物件 (會實際呼叫適當處理常式的物件) 是否可將處理常式放在集區中,並重複使用這些處理常式以增加效能。如果無法將處理常式放置在集區中,則每次 Factory 需要處理常式時都必須建立新的處理常式執行個體。

ProcessRequest 方法會負責處理個別的 HTTP 要求。在此方法中,您需撰寫可產生處理常式輸出的程式碼。

HTTP 處理常式能夠存取應用程式內容,包括提出要求的使用者識別 (如果已知)、應用程式狀態和工作階段資訊。要求 HTTP 處理常式時,ASP.NET 會呼叫適當處理常式的 ProcessRequest 方法。您在處理常式的 ProcessRequest 方法中撰寫的程式碼會建立回應,這個回應會傳回至提出要求的瀏覽器。

對應副檔名

一旦您建立了類別檔案做為 HTTP 處理常式,處理常式就可以回應任何尚未在 IIS 或 ASP.NET 中對應的副檔名。例如,如果您正在建立 HTTP 處理常式以產生 RSS 饋送,則可以將處理常式對應至 .rss 副檔名。為了讓 ASP.NET 知道自訂的副檔名要使用哪個處理常式,您必須在 IIS 中將副檔名對應至 ASP.NET。接著,您必須在應用程式中將副檔名對應至自訂處理常式。

根據預設,ASP.NET 會將 .ashx 副檔名對應至 HTTP 處理常式。如果您將 @ WebHandler 指示詞加入至類別檔案,則 ASP.NET 會自動將 .ashx 副檔名對應至預設的 HTTP 處理常式。這項機制的運作方式與您在使用 @ Page 指示詞時,ASP.NET 將 .aspx 副檔名對應至 ASP.NET 網頁處理常式的方式類似。因此,如果建立包含 .ashx 副檔名的 HTTP 處理常式類別,處理常式就會自動註冊到 IIS 和 ASP.NET。

如果您想為處理常式建立自訂的副檔名,必須明確地將副檔名註冊到 IIS 和 ASP.NET 中。不使用 .ashx 副檔名的好處在於,處理常式可以重複用在不同的副檔名對應作業中。例如,在某個應用程式中,自訂處理常式可能會回應以 .rss 副檔名為結尾的要求。在另一個應用程式中,它可能會回應以 .feed 副檔名為結尾的要求。另一個範例是,處理常式可能會對應至相同應用程式中的這兩個副檔名,但會依據副檔名建立不同的回應。

在 IIS 7.0 與舊版的 IIS 中,註冊處理常式之自訂副檔名的處理序是不一樣的。如需詳細資訊,請參閱 HOW TO:登錄 HTTP 處理常式HOW TO:在 IIS 中設定 HTTP 處理常式副檔名

非同步和同步 HTTP 處理常式

HTTP 處理常式可以是同步或者是非同步處理常式。除非同步處理常式完成處理它所呼叫的 HTTP 要求,否則並不會傳回同步處理常式。非同步處理常式會單獨執行將回應傳送至使用者的處理序。在您必須啟動時間較長的應用程式處理序,且使用者不需要等待它完成即可接收伺服器回應時,非同步處理常式會很有用。

非同步的 HTTP 處理常式可讓您啟動外部處理序 (例如遠端伺服器的方法呼叫),並繼續接著處理,而不需等待外部處理序完成。在非同步 HTTP 處理常式處理期間,ASP.NET 會將一般用於外部處理序的執行緒放回執行緒集區,直到處理常式接收到來自外部處理序的回呼 (Callback) 為止。這可防止執行緒封鎖並改善效能,因為同一時間只能執行有限數量的執行緒。如果許多使用者要求依賴外部處理序的同步 HTTP 處理常式,則因為許多執行緒會被封鎖並等待外部處理序,所以作業系統會用完執行緒。

在您建立非同步處理常式時,必須實作 IHttpAsyncHandler 介面。您必須同時實作 BeginProcessRequest 方法才能初始化非同步呼叫來處理個別 HTTP 要求。此外,您必須實作 EndProcessRequest 方法,以便於處理序結束時執行清除程式碼。

自訂 IHttpHandlerFactory 類別

IHttpHandlerFactory 類別會接收要求,並且負責將要求轉送到適當的 HTTP 處理常式。透過建立會實作 IHttpHandlerFactory 介面的類別,即可建立自訂 HTTP 處理常式 Factory。藉由根據執行階段狀況建立不同的處理常式,自訂處理常式 Factory 可讓您更精細地控制 HTTP 要求的處理方式。例如,使用自訂 HTTP 處理常式 Factory 時,如果 HTTP 要求方法為 PUT,您可以針對檔案類型為某個 HTTP 處理常式執行個體化,而如果方法為 GET 時,則為另一個處理常式執行個體化。

若要註冊處理常式 Factory 的自訂擴充功能,請遵循相關步驟來註冊處理常式的自訂擴充功能。如需建立與註冊處理常式 Factory 的範例,請參閱 逐步解說:建立和註冊 HTTP 處理常式 Factory

HTTP 模組

HTTP 模組是一個每次在應用程式收到要求時就會被呼叫的組件。HTTP 模組是用來做為要求管線的一部分而呼叫,並在整個要求中都有對生命週期事件的存取權。因此,HTTP 模組可讓您檢查連入要求,並根據要求採取動作。它們還可讓您檢查傳出的回應,並對其進行修改。

在 IIS 6.0 中,ASP.NET 要求管線會與 Web 伺服器要求管線分開。在 IIS 7.0 中,ASP.NET 要求管線和 Web 伺服器要求管線可以整合到通用的要求管線中。在 IIS 7.0 中,我們稱之為「整合」(Integrated)模式。統一的管線對 ASP.NET 開發人員的好處如下:例如,它可讓 Managed 程式碼模組接收所有要求的管線告知,即使這些要求並不是針對 ASP.NET 資源所發出的。但是,如果您需要的話,還是可以在「傳統」(Classic) 模式中執行 IIS 7.0,此模式會模擬於 IIS 6.0 中執行 ASP.NET。如需詳細資訊,請參閱 IIS 7.0 的 ASP.NET 應用程式生命週期概觀

ASP.NET HTTP 模組與 ISAPI 篩選常式 (Filter) 類似,因為這些模組也會針對所有要求而叫用。但是,它們是以 Managed 程式碼撰寫,所以能與 ASP.NET 應用程式的生命週期完全整合。您可以將自訂模組原始程式碼放置到應用程式的 App_Code 資料夾中,或者將編譯過的自訂模組當成組件放置到應用程式的 Bin 資料夾中。

ASP.NET 使用模組實作各種應用程式功能,包含表單驗證、快取、工作階段狀態和用戶端指令碼服務。在以上各種情況中,啟用這些服務時,模組會被視為要求的一部分而呼叫,並執行單一網頁要求範圍之外的工作。模組可以使用應用程式事件,並引發在 Global.asax 檔中處理的事件。如需應用程式事件的詳細資訊,請參閱 IIS 5.0 和 6.0 的 ASP.NET 應用程式生命週期概觀IIS 7.0 的 ASP.NET 應用程式生命週期概觀

注意事項:

HTTP 模組與 HTTP 處理常式不同。HTTP 處理常式會針對以副檔名或副檔名系列所識別的要求傳回其回應。反之,所有要求和回應則會叫用 HTTP 模組。此模式會在要求管線中訂閱事件告知,並讓您在註冊的事件處理常式中執行程式碼。對於應用程式中的資源而言,採用模組的所有工作可通用於應用程式與所有要求。

HTTP 模組的運作方式

模組可以加以註冊,以接收來自要求管線的告知。將 HTTP 模組註冊到應用程式的 Web.config 檔案中是最常見的方式。在 IIS 7.0 中,統一的要求管線也可讓您以其他方式來登錄模組,包括透過 IIS 管理員與 Appcmd.exe 命令列工具。如需詳細資訊,請參閱在 IIS 7.0 中設定處理常式對應 (英文) 和啟動 Appcmd.exe (英文)。

ASP.NET 建立表示應用程式之 HttpApplication 類別的執行個體時,也會建立任何已註冊之模組的執行個體。建立模組時,會呼叫它的 Init 方法,且模組會初始化它自己。如需詳細資訊,請參閱 IIS 5.0 和 6.0 的 ASP.NET 應用程式生命週期概觀和 ASP.NET IIS 7.0 的 ASP.NET 應用程式生命週期概觀

在模組的 Init 方法中,可訂閱各種應用程式事件 (例如 BeginRequestEndRequest),做法則是將事件繫結至模組內的方法。

注意事項:

至於在 IIS 7.0 整合管線中運作的模組,您應該在 Init 方法中註冊事件處理常式。

一旦引發應用程式事件,就會呼叫模組中適當的方法。此方法可執行任何所需的邏輯,例如檢查驗證或登入要求資訊。在事件處理期間,模組可以存取目前要求的 Context 屬性。這可讓您將要求重新導向至另一個網頁、修改要求,或執行其他任何要求管理。例如,如果模組檢查了驗證,則在認證不正確的情況下,模組可能會重新導向至登入或錯誤頁面。否則,當模組的事件處理常式執行完畢後,ASP.NET 會呼叫管線中的下一個處理序。對要求來說,這可能是另一個模組或適當的 HTTP 處理常式 (例如 .aspx 檔)。

HTTP 模組和 Global.asax 檔的比較

您可實作應用程式之 Global.asax 檔中的大部分模組功能,這可讓您回應應用程式事件。然而,模組會比 Global.asax 檔有優勢,因為封裝的模組只需建立一次就可用於許多不同的應用程式。藉由將模組加入至全域組件快取,並在 Machine.config 檔中進行註冊,您便可以在各個應用程式中重複使用它們。如需詳細資訊,請參閱全域組件快取

注意事項:

在 IIS 7.0 中,整合管線可讓 Managed 模組針對所有要求,而不只是 ASP.NET 資源要求,訂閱管線告知。在應用程式資源的要求期間,只會針對告知叫用 Global.asax 檔案中的事件處理常式。您可以明確定義整合模式中的自訂模組範圍,只針對應用程式要求接收事件告知。否則,自訂的模組會針對所有應用程式要求接收事件告知。如果將 precondition 屬性 (屬於 modules 區段的 add 項目) 設為 "managedHandler",則模組範圍將定義為應用程式。

使用 Global.asax 檔的優勢是您可以處理如 Session_Start 和 Session_End 之類的其他已註冊事件。此外,Global.asax 檔也可讓您將全域物件個體化,以便在整個應用程式中使用。

任何時候當您必須依照應用程式事件來建立程式碼,以及當下列條件成立時,您都應該使用模組:

  • 您想要在其他應用程式中重複使用模組。

  • 您想要避免將複雜程式碼放置到 Global.asax 檔案中。

  • 模組會套用到管線中的所有要求 (僅限 IIS 7.0 整合模式)。

任何時候當您必須依照應用程式事件來建立程式碼,而且您不想要在其他應用程式中重複使用它時,就應該將程式碼加入 Global.asax 檔案中。當您需要訂閱並未提供給模組使用的事件 (例如 Session_Start) 時,也可以使用 Global.asax 檔案。

建立 HTTP 模組

撰寫 Http 模組的一般處理程序如下:

如需如何從 IIS 6.0 (含) 以前的版本所執行的應用程式中,將模組移至 IIS 7.0 中執行之應用程式的詳細資訊,請參閱將 ASP.NET 應用程式從 IIS 6.0 移至 IIS 7.0

回到頁首

程式碼範例

快速入門

HTTP 處理常式和 Factory

使用說明和逐步解說主題

HOW TO:登錄 HTTP 處理常式

HOW TO:在 IIS 中設定 HTTP 處理常式副檔名

逐步解說:建立同步的 HTTP 處理常式

HOW TO:建立非同步的 HTTP 處理常式

逐步解說:建立和註冊 HTTP 處理常式 Factory

逐步解說:建立和註冊自訂 HTTP 模組

回到頁首

類別參考

下表列出 HTTP 模組和 HTTP 處理常式的主要伺服器類別。

類別

描述

IHttpModule

用來藉由實作介面,然後在 Web.config 檔中註冊模組,建立自訂 HTTP 模組。

IHttpHandler

用來藉由建立可實作介面的類別,建立自訂、同步 HTTP 處理常式。

IHttpAsyncHandler

用來藉由建立可實作介面的類別,建立自訂、非同步 HTTP 處理常式。

回到頁首

請參閱

概念

IIS 5.0 和 6.0 的 ASP.NET 應用程式生命週期概觀

IIS 7.0 的 ASP.NET 應用程式生命週期概觀

參考

回到頁首