asp.net ashx IHttpHandler c#
實際上,Framework提供了一系列的接口和類,允許你對于Http請求進行編程,而實現這一操作的一個主要的接口,就是 IHttpHandler(另一個是IHttpModule)。
應該還記得第一節中我們提到過 ISAPI,它根據文件名后綴把不同的請求轉交給不同的處理程序。但是仔細看看就會發現:幾乎一大半的文件都交給 aspnet_isapi.dll 去處理了。很明顯,aspnet_isapi.dll 不可能對每種文件采用同一種方式處理,那么 aspnet_isapi.dll 是如何更進一步處理不同的文件,交由誰去處理呢?為了搞清楚這個問題,我們需要打開機器上C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\ 目錄下的web.config 文件。
NOTE:我查閱了很多資料,都說是在 machine.config 中,但實際上 v2.0.50727 下的machine.config中httpHandlers結點是這樣的:<httpHandlers />,并沒有給出詳細的處理程序,在Web.config中才能看到。而v1.1.4322 下的machine.config中卻有。
找到httpHandlers結點,應該可以看到如下這樣的代碼(做了省略):
<httpHandlers>
... ... //略
<add path="*.axd" verb="*" type="System.Web.HttpNotFoundHandler" validate="True" /><add path="*.aspx" verb="*" type="System.Web.UI.PageHandlerFactory" validate="True" />
<add path="*.ascx" verb="*" type="System.Web.HttpForbiddenHandler" validate="True" />
</httpHandlers>
可以看到,在<httpHandlers>結點中將不同的文件類型映射給不同的Handler去處理,對于.aspx來說,是由System.Web.UI.PageHandlerFactory來處理。而對于.cs來說,是由System.Web.HttpForbiddenHandler 處理,從ForbiddenHandler名字中出現的Forbidden (翻譯過來是“禁止”)可以看出,這個Handler可以避免我們的源碼被看到。
NOTE:System.Web.UI.PageHandlerFactory 是一個IHttpHandlerFactory,而不是一個單一的HttpHandler,IHttpHandlerFactory用來做什么后面會說明。
上面列出的是.Net Framework在處理Http請求時的所采用的默認Handler。而如果我們要用編程的方式來操控一個Http請求,我們就需要實現IHttpHandler接口,來定制我們自己的需求。
IHttpHandler的定義是這樣的:
public interface IHttpHandler{
}
由上面可以看出IHttpHandler要求實現一個方法和一個屬性。其中 ProcessRequest,從名字(處理請求)看就知道這里應該放置我們處理請求的主要代碼。
IsReusable屬性,MSDN上是這樣解釋的:獲取一個值,該值指示其他請求是否可以使用 IHttpHandler 實例。也就是說后繼的Http請求是不是可以繼續使用實現了該接口的類的實例,一般來說,我把它設置成true。
那么實現此接口的類形式應該是這樣的:
public class CustomHandler : IHttpHandler{
}
而為了能使用這個自定義的HttpHandler,我們需要在應用程序目錄下的Web.config中注冊它。
<system.web>
</system.web>
應該發現這與之前在C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\目錄下web.config中看到的幾乎完全一樣。這里,path指的是請求的文件名稱,可以使用通配符擴大范圍,也可以明確指定這個handler僅用于處理某個特定的文件(比如說:filename.aspx)的請求。verb指的是請求此文件的方式,可以是post或get,用*代表所有訪問方式。type屬性由“,”分隔成兩部分,第一部分是實現了接口的類名,第二部分是位于Bin目錄下的編譯過的程序集名稱。
NOTE:如果你新建一個項目,并且在項目下創建HandlerTest.cs,然后讓站點引用該項目,那么在生成解決方案的時候會自動將編譯好的.dll文件添到Bin目錄中。
使用HttpHandler實現圖片防盜鏈
有了之前這么多的準備知識,實現現在的目標就容易得多了:
NOTE:這個例子,以及下面的一個例子均來自于《Maximizing ASP.NET Real World, Object-Oriented Development》一書:
Step.1:創建文件 CustomHandler.cs,代碼如下:
using System;
using System.Web;
namespace CustomHandler{