小結於MSDN: http://msdn.microsoft.com/zh-cn/library/ms228090(v=vs.80).aspx
在Http請求的處理過程中,可以通過framework提供的相應類和介面來對Http請求進行編程,主要有兩個介面,一個是IHttpHandler,一個是IHttpModule,IHttpHandler處於整個請求處理過程的末端,建立的WebForm頁繼承自System.Web.UI.Page,而Page類則繼承自IHttpHandler,也就是說對一個*.aspx檔案的請求最終會交給一個IHttpHandler的實作類別來處理,管它叫作頁處理常式,它僅僅是一種類型的處理常式。ASP.NET還包括其他幾種內建的處理常式,例如用於*.asmx檔案的Web服務處理常式,以及*.ascx檔案的使用者控制項處理常式等。
public partial class Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //// } } public class Page : TemplateControl, IHttpHandler { /// }
在應用程式生命週期中,IIS會把對ASP.NET相關資源的請求交給aspnet_isapi.dll去處理,然後aspnet_isapi.dll會根據請求資源的類型把請求交給相對應的HttpHandler去做進一步處理,這之間存在請求資源與處理常式(HttpHandler)的映射操作,開啟C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config【這裡是framework2目錄下,framework4目錄下也是一樣的都在web.config中】,找到<httpHandlers>節點,就一目瞭然了,有所的內建處理常式的映射都已經在這裡被設定好了。
有時候,這些內建的處理常式(HttpHandler)並不能滿足我們功能需要,這時我們可以建立自訂HTTP處理常式。下面的方案就很好地利用了自訂HTTP處理常式:
(1)RSS源
若要為網站建立RSS源,可以建立一個可發出RSS格式XML的處理常式。然後將您應用程式中的.rss副檔名(舉例)綁定到此自訂處理常式上。當使用者向網站發送以.rss結尾的請求時,ASP.NET將調用您的處理常式來處理請求。
(2)映像伺服器
如果希望 Web 應用程式能夠提供不同大小的映像,可以編寫一個自訂處理常式來調整映像大小,然後將調整後的映像作為處理常式的響應返回給使用者。
HTTP 處理常式可以是同步的也可以是非同步。同步處理常式在完成對HTTP請求的處理後才會返回。非同步處理常式運行進程的行為與向使用者發送響應無關。當您需要啟動一個可能耗費很長時間的應用程式進程,而使用者又無需等候進程完成以便從伺服器擷取響應時,非同步處理常式非常有用。
建立簡單的同步HTTP處理常式
該處理常式對ASP.NET應用程式中其URL以.sample結尾的資源執行同步請求處理,此程式碼範例闡釋了下列內容:
(1)一個 HTTP 處理常式類的代碼。該類必須實現 ProcessRequest 方法和 IsReusable 屬性。
(2)Web.config 檔案中註冊該處理常式並將 .sample 副檔名映射到該處理常式所需的元素。
當使用者請求一個其URL以.sample結尾的資源時,Web伺服器將該請求轉寄給ASP.NET。然後ASP.NET調用HTTP處理常式,後者返回一個響應。該響應由該處理常式動態建立;應用程式中不需要存在具有副檔名為.sample的檔案
在VS中建立一個IHttpHandler的實作類別有兩種方法,在Add New Item面版上有兩個Handler選擇,一個是ASP.NET Handler選項,另一個是Generic Handler選項,可以分別選中,看看VS產生的程式碼有什麼不同,可以發現基本上是一樣的。
public class HelloWorldHandler2 : IHttpHandler { public bool IsReusable { get { return false; } } public void ProcessRequest(HttpContext context) { context.Response.ContentType = "text/plain"; HttpResponse response = context.Response; response.Write("this is handler2 page!"); } }
IsReusable屬性:告訴ASP.NET此HttpHandler是否可以放在池中給下一個(或幾個)請求繼續使用,如果不可以,ASP.NET就會為每次請求使用一個新構造的IHttpHandler執行個體。
在自訂的HTTP處理常式寫好之後,接下來要做的就是映射,得告訴ASP.NET,當我們發起對某類資源請求時它得使用哪個處理常式來進一步處理該請求,在IIS7中只要在Web.config 檔案中註冊自訂的HTTP處理常式就可以了,IIS6可以參考MSDN.
<configuration> <system.web> <compilation debug="true" targetFramework="4.0" /> <httpHandlers> <add verb="*" path="*.sample" type="HttpHandlerTest.HelloWorldHandler,HttpHandlerTest"/> </system.web> <system.webServer> <validation validateIntegratedModeConfiguration="false"/> <handlers> <add name="aa" verb="*" path="*.sample" type="HttpHandlerTest.HelloWorldHandler,HttpHandlerTest"/> </handlers> </system.webServer></configuration>
為了相容IIS6,在<system.web>和<system.webServer>結點中都要註冊
verb指的是採用哪種HTTP方法(GET,PUT,POST等),verb="*"代表所有方法
path指定路徑屬性可以包含單個URL路徑或簡單的萬用字元字串(如*.aspx)
type中的值以逗號分隔,前面是該處理常式所在的命名空間,後面是該處理常式所在的程式集名,不帶.dll
測試自訂HTTP處理常式
在瀏覽器中,輸入一個指向 Web 應用程式並以 .sample 結尾的 URL,如下所示:
http://localhost/HttpHandlerTest/test.sample
將顯示:this is handler2 page!