本文内容
- 引入
- IHttpHandler 概述
- 示範建立自定義 HTTP 處理程式
- 建立自定義 HTTP 處理程式
- 映射檔案擴充名
- 測試自定義 HTTP 處理程式
- 參考資料
引入
當建立一個名為 WebForm1 的 .aspx 檔案後,這個頁面相應的 .aspx.cs 檔案内容如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace HttpHandlerDemo
{
public partial class WebForm1 : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
}
}
任何人對這個頁面再熟悉不過。但更進一步,這個背景檔案繼承 System.Web.UI.Page 類,而該類又繼承 System.Web.UI.TemplateControl 類和 System.Web.IHttpHandler 接口。值得注意的是 IHttpHandler。
本文在 VS 2008 和 IIS 6 環境下概述如何利用 IHttpHandler 自定義 HTTP 處理程式。
本文重在工程實踐,以實踐看理論,這多少符合點參加工作的人實際情況。我是比較讨厭大段大段的文字描述和理論的。雖然寫得簡單,但若深究下去涉及的問題實在很多,随便寫點什麼,都可以成為專門的主題。
在網上或是群裡看到太多人問得問題,一是自己不思考,稍微遇到點問題,就迫切尋求他人幫助;二是基礎太差,知識量不夠,或是知道的過于膚淺。這些都是阻礙自己進步的巨大障礙。
在本文的描述中,希望能體會、意識到 IHttpHandler 能做什麼、能為你的項目做什麼。
學習的過程不能一蹴而就,起初你隻是知道一個個資訊點,一個個實作方式,但若堅持下去,認真思考它們内在的東西,最終這些資訊在你腦中會形成一個體系。
IHttpHandler 概述
IHttpHandler 是 ASP.NET 提供一個底層的請求/響應 API,使開發人員可以利用 .NET Framework 為到來的 HTTP 請求服務。是以,你可以建立自己的 HTTP 處理程式,将自定義輸出呈現給浏覽器。
ASP.NET HTTP 處理程式是響應對 Web 應用程式的請求而運作的過程。最常見的處理程式是處理 .aspx 檔案的 ASP.NET 頁處理程式。使用者請求 .aspx 檔案時,頁面通過頁處理程式來處理請求。
自定義 HTTP 處理程式通常具有以下用途:
- RSS 源。若要為網站建立 RSS 源,可以建立一個可發出 RSS 格式 XML 處理程式。然後将檔案擴充名,如 .rss,綁定你自定義的處理程式。當使用者向站點發送以 .rss 結尾的請求時,ASP.NET 将調用你自定義的處理程式來處理該請求。
- 圖像伺服器。如果希望 Web 應用程式能夠提供不同大小的圖像,可以編寫一個自定義處理程式來調整圖像大小,将調整後的圖像作為處理程式的響應發送給使用者。
除了 ASP.NET 頁面處理程式外,ASP.NET 還有其他幾種内置的處理程式。如下表所示:
處理程式 | 說明 |
ASP.NET 頁處理程式 (*.aspx) | 用于所有 ASP.NET 頁的預設 HTTP 處理程式。 |
Web 服務處理程式 (*.asmx) | 在 ASP.NET 中作為 .asmx 檔案建立的 Web 服務頁的預設 HTTP 處理程式。 |
泛型 Web 處理程式 (*.ashx) | 不含 UI 和包括 @ WebHandler 指令的所有 Web 處理程式的預設 HTTP 處理程式。 |
跟蹤處理程式 (trace.axd) | 顯示目前頁跟蹤資訊的處理程式。 |
示範建立自定義 HTTP 處理程式
建立自定義 HTTP 處理程式
若要建立自定義 HTTP 處理程式,需要建立實作 IHttpHandler 接口的類。這是一個同步處理程式(實作 IHttpAsyncHandler 可以建立一個異步處理程式,兩種處理程式接口都要求您實作 IsReusable 屬性和 ProcessRequest 方法)。
- IsReusable 屬性指定 IHttpHandlerFactory 對象(實際調用适當處理程式的對象)是否可以将處理程式放置在池中,并且重新使用它以提高性能。如果處理程式不能放在池中,則在每次需要處理程式時工廠都必須建立處理程式的新執行個體。
- ProcessRequest 方法負責處理單個 HTTP 請求。
HTTP 處理程式有權通路應用程式上下文。其中包括請求使用者的辨別(如果已知)、應用程式狀态和會話資訊。當請求 HTTP 處理程式時,ASP.NET 将調用相應處理程式的 ProcessRequest 方法。您在處理程式的 ProcessRequest 方法中編寫的代碼将建立一個響應,此響應随後發送回請求浏覽器。
如下所示建立一個名為 HelloWorldHandler 的處理程式:
using System;
using System.Web;
namespace HttpHandlerDemo
{
public class HelloWorldHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
HttpRequest Request = context.Request;
HttpResponse Response = context.Response;
Response.Write("<html>");
Response.Write("<body>");
Response.Write("<h1>Hello from a synchronous custom HTTP handler.</h1>");
Response.Write("</body>");
Response.Write("</html>");
}
public bool IsReusable
{
get
{
return true;
}
}
}
}
映射檔案擴充名
HelloWorldHandler 處理程式可以響應尚未在 IIS 和 ASP.NET 中映射的任何檔案擴充名。
為了使 ASP.NET 了解為你的自定義檔案擴充名使用哪個處理程式,在 IIS 中必須将該擴充名映射到 ASP.NET。然後在應用程式中必須将該擴充名映射到自定義處理程式。
如下所示:
<httpHandlers>
<add verb="*" path="*.sample" type="HttpHandlerDemo.HelloWorldHandler"/>
</httpHandlers>
測試自定義 HTTP 處理程式
這樣,當你輸入 http://localhost/mytest.sample,任何以 .sample 結尾的請求時,都會調用 HelloWorldHandler 處理程式。
運作結果:

參考資料
MSDN HTTP 處理程式和 HTTP 子產品概述 http://msdn.microsoft.com/zh-cn/library/bb398986(v=VS.90).aspx
.NET Framework IHttpHandler http://msdn.microsoft.com/zh-cn/library/system.web.ihttphandler(v=VS.90).aspx
下載下傳 Demo