ASP.NET中的Http Handles
來源:互聯網
上載者:User
asp.net 一、關於http handles
ASP.NET的請求過程是基於一個管道(pipeline)模型的,ASP.NET會把所有的http請求(Requests)都發送給這個管道裡的http組件(modules)。每個組件在接收到http請求後進行一些相應的動作。當http請求通過了所有的http modules程式後,將會被交由一個http handle程式來處理,處理後的結果又將通過管道裡http modules返回。這整個過程中,被調用的http module可以有多個,然而調用的http handle只能是一個。其過程如圖:
可以看出每個輸入的http請求都會最終被一個http handle程式處理。http handle是一個實現了System.Web.IHttpHandler介面的類的執行個體,有些類似ISAPI擴充。在http handles中實現的有:
ProcessRequest:該方法用來處理http請求,是http handles最核心的方法
IsReusable:一個屬性,返回一個bool值,來表示這http handle的執行個體是否能被重用來處理多個同類型的http請求。
二、在設定檔中註冊http handles
http handles的類可以在web.config或machine.config檔案裡註冊。這樣,一旦有相應的http請求輸入,這個http handle類就會被執行個體化。在web.config或machine.config檔案裡我們用<httpHandlers>和<add>節點來為我們的應用程式添加http handle類:
<httpHandlers>
<add verb="supported http verbs" path="path" type="namespace.classname, assemblyname" />
<httpHandlers>
在<add>裡
1、verb屬性說明了該handle所支援的http請求方式,例如支援post和get方式,verb屬性則為"POST,GET";如果支援所有的請求方式,verb屬性則用"*"。
2、path屬性說明了對哪些檔案的請求才調用該handle來處理,例如你只想在請求my.possible檔案時才調用該handle,則path屬性為"my.possible",如果你想所有尾碼名為possible的檔案(*.possible)都由該handle來處理,則path屬性為"*.possible"。
3、type屬性中指定了handle類的命名空間、類名和配件名(工程名)。ASP.NET runtime會首先到應用程式的bin目錄下尋找該配件的dll,如果沒有找到再到GAC裡尋找。
其實ASP.NET自身裡的許多功能也是使用HTTP handlers來實現,ASP.NET使用了許多的handle類來處理.aspx, .asmx, .soap 和一些其它的ASP.NET檔案。你可以在machine.config檔案裡找到如下代碼:
<httpHandlers>
<add verb="*" path="trace.axd" type="System.Web.Handlers.TraceHandler"/>
<add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/>
<add verb="*" path="*.ashx" type="System.Web.UI.SimpleHandlerFactory"/>
<add verb="*" path="*.config" type="System.Web.HttpForbiddenHandler"/>
<add verb="GET,HEAD" path="*" type="System.Web.StaticFileHandler"/>
. . . . . .
. . . . . .
</httpHandlers>
從上面的配置可以看出來對.aspx檔案的請求是交由System.Web.UI.PageHandlerFactory類來處理的,而象.config檔案是被System.Web.HttpForbiddenHandler類來處理,可以猜想這個類將會返回一個該類檔案不能被請求的錯誤。
三、http handles類的實現
在這裡我們用C#來建立一個新的handle類來處理新的檔案類型,比如以.possible為尾碼名的檔案。
1、我們先在vs.net裡建立web應用程式的工程,名為MyHandler,然後添加一個類檔案NewHandler.cs來建立實現了IHttpHandler介面的類:
using System;
using System.Web;
namespace MyHandler
{
/// <summary>
/// Summary description for NewHandler.
/// </summary>
public class NewHandler : IHttpHandler
{
public NewHandler()
{
//
// TODO: Add constructor logic here
//
}
#region Implementation of IHttpHandler
public void ProcessRequest(System.Web.HttpContext context)
{
HttpResponse objResponse = context.Response ;
objResponse.Write("<html><body><br><br><center>Hi,This is a test! ") ;
objResponse.Write("</center></body></html>") ;
}
public bool IsReusable
{
get
{
return true;
}
}
#endregion
}
}
在ProcessRequest方法的實現裡,我們只是簡單的擷取了HttpContext的HttpResponse對象,並象用戶端發送了一些html。在IsReusable的實現裡返回true,表示該handle類的執行個體可以處理多個對.possible檔案的請求。
注意:如果想在HTTP handlers裡使用session,那麼還需要實現IRequiresSessionState介面,而IRequiresSessionState介面只是一個標誌,不需要實現任何的具體方法,所以只需要把類申明改為:public class NewHandler : IHttpHandler,IRequiresSessionState即可。
2、開啟web.config檔案,註冊上面新建立的handle類:
<httpHandlers>
<add verb="*" path="*.possible" type="MyHandler.NewHandler,MyHandler"/>
</httpHandlers>
3、在IIS中添加ISAPI擴充,將我們的新尾碼名.possible添加進去,具體過程為:
IIS--》選中“預設網站”點右鍵--》選“屬性”--》“主目錄”--》“配置”--》點“映射”裡的“添加”按鈕--》在彈出對話方塊裡點擊“瀏覽”按鈕,選擇aspnet_isapi.dll檔案,並在副檔名裡填possible,如下圖所示:
最後點擊確定按鈕。
這樣我們就可以在瀏覽器裡輸入http://localhost/MyHandler/xxx.possible,來調用該handle了。當然我們這裡只是舉了個簡單例子,所以輸入任何*.possible都是一樣的效果。我們可以在NewHandler的ProcessRequest方法裡先分析請求的url,然後根據不同url作出不同的相應,比如跳轉到不同的真實存在的aspx頁面,這也正是web設計模式中MVC模式在asp.net中通過Front Controller實現的核心部分之一,具體請見:http://msdn.microsoft.com/architecture/patterns/default.aspx?pull=/library/en-us/dnpatterns/html/DesFrontController.asp。