ASP.Net中自訂Http處理及應用之HttpHandler篇[轉1]

來源:互聯網
上載者:User
在開發基於Microsoft IIS的應用時,開發人員除了可以編寫ASP程式外,還可以使用Visual
C++等開發工具,開發ISAPI應用,以擷取更為強大的功能。可以編寫兩種ISAPI擴充:一種是ISAPI Server Extention,另一種是ISAPI
Filter,但是,ISAPI擴充應用的編寫通常對開發人員有比較高的要求,開發和部署的難度比較大。
在開發ASP.Net應用時,我們仍然可以編寫ISAPI應用,以擴充IIS的功能,但是,ASP.Net為我們提供了另外一種選擇——使用HTTP Handler
和HTTP Module。這是通過使用IHttpHandler 和 IHttpModule介面來實現的。HTTP Handler提供了類似於ISAPI
Server Extention的功能,而HttpModule實現了類似於ISAPI Filter的功能,並且,比ISAPI,在開發和部署上都要簡單的多。
應用HttpHandler和HttpModule,使應用程式可以與IIS
Web伺服器的低層級請求和響應服務互動。本文首先介紹HttpHandler和HttpModule的概念和基本使用方法,並介紹了一個應用HttpModule實現許可權系統的案例。

HTTP 處理管道的基本模型
要對HttpModule和IHttpHandler進行研究,必須先對ASP.Net的處理管道有一個瞭解。
在ASP.Net應用程式中,系統使用一組相關的類,通過一定的順序來處理用戶端的請求(Request),ASP.NET應用程式的處理模式可稱之為HTTP處理管道。HttpModule和IhttpHandler就是這個處理管道上的兩個處理環節。
HTTP處理管道中的類在System.Web名稱空間中定義,主要有以下類型: · HttpWorkerRequest
抽象類別定義了ASP.Net頁面處理請求的基本方法; · HttpRuntime 提供了處理應用的一組服務; · HttpContext
儲存了處理一次請求的所有相關上下文資訊; · HttpApplicationFactory 提供相關目錄的應用程式; · HttpApplication
定義了所有ASP.Net應用程式的通用的方法、屬性和事件。這個類也是在使用者在global.asax檔案中定義的應用的基類; · Modules
處理請求前和響應後的事件; · HandlerFactories 提供應用程式中的Handlers; · Handlers 處理請求和響應。
HTTP處理管道的模型如下:
 
圖1:HTTP
處理管道
在Windows平台上,HTTP
Pipline需要IIS的支援。為了運行ASP.NET應用,IIS需要以下兩個檔案:ASPNET_ISAPI.DLL和ASPNET_WP.EXE ·
ASPNET_ISAPI.DLL是一個ISAPI Extention他將發向IIS的請轉交ASPNET_WP.EXE處理 ·
ASPNET_WP.EXE使用HttpRuntime對請求進行具體處理 處理的過程可以用圖表示如下:
 
圖2:IIS上的HTTP處理管道
HttpHandler的實現
HttpHandler實現了類似於ISAPI
Extention的功能,他處理請求(Request)的資訊和發送響應(Response)。HttpHandler功能的實現通過實現IHttpHandler介面來達到。實際上,我們在編寫ASP.Net頁面時,ASP.Net頁面所繼承的基類——System.Web.UI.Page——也實現了HttpHandler介面,也是一個HttpHandler,看一下它的定義就知道了(C#):

public class Page : TemplateControl, IhttpHandler

介面IHttpHandler的定義如下:
interface IHttpHandler
{
void
ProcessRequest(HttpContext ctx);
bool IsReuseable { get; }
}

介面中ProcessRequest是添加自己的代碼,進行相應處理的地方。IsReuseable屬性指明該HttpHandler的實作類別是否需要緩衝。
下面的樣本展示了HttpHandler的基本使用: 1、建立一個名為MyNameSpace的工程,添加一個類,名稱為MyHandler,代碼如下:

例1:
namespace MyNameSpace
{
public class MyHandler :
IHttpHandler
{
public void ProcessRequest(HttpContext ctx)
{

HttpResponse Response
Response.Write("This is my handler");}
public
bool IsReusable
{
get { return true; }
}
}
}


2、將上面的代碼編譯,產生MyNameSpace.Dll檔案;
3、建立一個新的WebApplication項目,或開啟一個WebApplication項目,將檔案MyNameSpace.Dll添加到項目的引用中,或複製到項目的bin目錄下;
4、修改Web.Config,添加如下內容:
<configuration>
<system.web>

<httpHndlers>
<add verb="*" path="*.aspx"
type="
MyNameSpace.MyHandr, MyNameSpace" />
</httpHndlers>

</system.web>
</configuration>


設定檔中的選項說明: ·
verb可以是"GET"或"POST",表示對GET或POST的請求進行處理。"*"表示對所有請求進行處理。 ·
Path指明對相應的檔案進行處理,"*.aspx"表示對發給所有ASPX頁面的請求進行處理。可以指明路徑,如"/test/*.aspx",表明只對test目錄下的ASPX檔案進行處理。
· Type屬性中,逗號前的字串指明HttpHandler的實作類別的類名,後面的字串指明Dll檔案的名稱。
現在,請求項目中的任何ASPX頁面,頁面上顯示的始終只有如下一行字:
This is my handler

因為,我們自訂的Handler截獲了所有發向ASPX頁面的請求,並且用自己的的方法來處理這些請求了。
為了使我們的ASPX頁面能夠順利運行,我們需要修改Web.Config檔案:
<configuration>

<system.web>
<httpHndlers>
<add verb="*" path="*.foo"

type=" MyNameSpace.MyHandr,hander" />
</httpHndlers>

</system.web>
</configuration>

為了讓對尾碼名為.foo的檔案的請求能夠被我們的Handler截獲運行,我們還需要一些額外的工作。開啟IIS的管理主控台,又鍵單擊網站,選擇"屬性",跳出網站的屬性對話方塊。選擇主目錄選項。3:

 

圖3:Web網站屬性對話方塊

選擇配置,彈出應用程式配置對話方塊,將".foo"添加到應用程式對應中,4:
 
圖4:添加應用程式對應

好了,我們現在可以在項目中添加一個.foo檔案,當向該檔案發送請求時,瀏覽器顯示:
This is my handler

而對其他ASPX檔案的訪問不受影響。
實現Handler Factory

實現HttpHandler功能的另外一個選擇是實現一個Handler Factory,這是通過實現IHttpHandlerFactory介面來實現的。
IHttpHandlerFactory介面的定義如下:
interface IHttpHandlerFactory
{

IHttpHandler GetHandler(HttpContext ctx,
string requestType,
string
url,
string pathTranslated);
void ReleaseHandler(IHttpHandler handler);

}

GetHandler方法在請求開始的時候被調用,而ReleaseHandler在請求結束,所有的Handler都不再需要的時候被調用。
使用HttpHandlerFactory的過程一般如下:
首先定義實際處理HttpHandler的類,這個類會在HandlerFactory中被調用以進行實際的處理:
public class
BasicHandler : IHttpHandler { ... }

然後,定義自己的HandlerFactory:
public class
BasicHandlerFactory : IHttpHandlerFactory
{
public IHttpHandler
GetHandler(HttpContext ctx,
string requestType,
string url,
string
pathTranslated)
{
return new BasicHandler();
}
public void
ReleaseHandler(IHttpHandler handler) {}
}

最後,在Web.Config檔案中註冊這個Factory:

<configuration>
<system.web>
<httpHandlers>
<add
verb="POST" path="*.foo"
type="MyNamespace.BasicHandlerFactory, MyAssembly"
/>
</httpHandlers>
</system.web>
</configuration>

非同步Handler

通過實現IHttpAsyncHandler可以實現對HTTP請求的非同步處理。IHttpAsyncHandler介面繼承IHttpHandler,也需要實現ProcessRequest
方法和 IsReusable 屬性,同時,需要實現 BeginProcessRequest 和 EndProcessRequest
方法。BeginProcessRequest 啟動非同步呼叫以處理單個的 HTTP 要求,而 EndProcessRequest 則在該進程結束時執行清理代碼。
IHttpAsyncHandler的實現和註冊同IHttpHandler類似,讀者可以參考MSDN的相關文檔。 現在,大家是否對HTTP
Handler的概念和應用有了一定的瞭解?在下一篇文章中,我們將主要介紹HTTP Module的的應用,並給出使用HttpModule實現許可權系統的執行個體。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.