前言
之前從網上找了幾篇講解如何自定義HttpHandler的文章,依葫蘆畫瓢卻一直沒成功過。經過上一篇《asp.net管道模型(管線模型)之一發不可收拾》的總結,對管道模型和請求/響應過程有進一步的了解后,再結合Asp.Net 構架(Http Handler 介紹) - Part.2后終於成功定義自己的HttpHandler和HttpHandlerFactory了^_^、
本文有些地方會跟《asp.net管道模型(管線模型)之一發不可收拾》有些重疊,但角度會有所不同,兩篇文章相互補充,希望能完整地呈現管道模型的全貌。
目錄
1.發送Default.aspx時默認得到相應HttpHandler的過程;
2.如何配置;
5.應用實例。
發送Default.aspx時默認得到相應HttpHandler的過程
IIS下有一個metabase文件,可通過網站—》屬性—》主目錄—》配置—》映射中添加、修改、刪除。
圖1
IIS會檢查請求文件是否在metabase文件中有對應的處理應用程序。default.aspx對應的是Aspnet_ISAPI.exe來處理(所以執行文件路徑為Aspnet_ISAPI.exe的文件均由它處理),然后Aspnet_ISAPI.exe就把請求轉發到Asp.net工作進程。跳到管道模型的HttpApplication中(之前還有很多步驟,這里着重講解HttpApplication后面的步驟),HttpApplication根據Url的后綴名調用相應的HttpHandlerFactory(默認情況下.aspx調用System.Web.UI.PageHandlerFactory,.ashx調用System.Web.UI.SimpleHandlerFactory),然后HttpHandlerFactory在生成default.aspx具體的HttpHandler實例。
之前一直迷失在如何配置的問題上,這里先說明白吧!
下面是自定義HttpHandler時配置的根據:
IIS進行第一次篩選,HttpApplication進行第二次篩選。所以
1.自定義時要配置IIS讓它把對應的文件后綴映射到Asp_ISAPI.exe來處理;
2.在應用程序級web.config中配置<HttpHandlers>節點使HttpApplication能根據配置把請求交由相應的HttpHandlerFactory或HttpHandler處理。
具體web.config配置:
1 <handlers>
2 <add verb="*" path="*.myhandler" type="My.MyHandler,MyAssembly"/>
3 </handler>
verb:請求動作(get,post,*);
path:文件路徑(*通配符);
type:,前的參數為自定義HttpHandler或HttpHandlerFactory的完整類名(含命名空間),,后的參數為自定義HttpHandler或HttpHandlerFactory所在的程序集名(不含dll后綴)。
定義一個繼承IHttpHandler接口的類並實現接口的方法:
1 public class MyHandler:IHttpHandler
2 {
3 public MyHandler()
4 {
5 }
6
7 public void ProcessRequest(HttpContext context)
8 {
9 context.Response.ContentType = "text/html";
10 context.Response.Write("MyHandler");
11 }
12
13 public bool IsReusable
14 {
15 get { return true; }
16 }
17 }
1.ProcessRequest方法就是具體處理請求的地方;
2.IsReusable標識該HttpHandler類的實例對象是否可重用。就是當第一個請求發送過來時,實例化一個HttpHandler實例對象,如果IsReusable為true,那么第二個請求發送過來時就可以用回該實例對象而不用重新構造一個,如果為false就要重新構造一個實例。(有點啰嗦了(*^__^*) 嘻嘻……)一般返回true,提高效率嘛!!
web.config中配置
1 <Handlers>
2 <add verb="*" path="*.gif" type="MyHandler,MyHandler"/>
3 </Handlers>
IIS中配置,在圖1中添加一項映射項,擴展名為.gif,可執行文件路徑為C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll,動作為全部動作,然后把“確定文件是否存在”的復選框取消選中(如果選中了,就必須由對應的文件存在才能處理,如url為a.gif,就必須有a.gif文件真實存在,否則就返回404)。
注意:自定義的HttpHandler必須放在其他項目工程中,然后引用到Web項目中,也就是說配置文件中的type的程序集名稱必須寫,否則無法執行。
定義一個繼承IHttpHandlerFactory接口的類並實現接口的方法:
1 public class MyHandlerFactory:IHttpHandlerFactory
2 {
3 public MyHandlerFactory()
4 {
5 }
6
7 #region IHttpHandlerFactory 成員
8
9 public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
10 {
11 return new MyHandler();
12 }
13
14 public void ReleaseHandler(IHttpHandler handler)
15 {
16 throw new NotImplementedException();
17 }
18
19 #endregion
20 }
1.GetHandler獲取新的具體的HttpHandler實例;
2.ReleaseHandler使工廠可以重用現有的處理程序實例。
web.config中配置
1 <Handlers>
2 <add verb="*" path="*.gif" type="MyHandlerFactory,MyHandlerFactory"/>
3 </Handlers>
這里不用配置MyHandler。
IIS中配置,在圖1中添加一項映射項,擴展名為.gif,可執行文件路徑為C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll,動作為全部動作,然后把“確定文件是否存在”的復選框取消選中(如果選中了,就必須由對應的文件存在才能處理,如url為a.gif,就必須有a.gif文件真實存在,否則就返回404)。
Asp.Net 構架(Http Handler 介紹) - Part.2中有一個使用HttpHandler防止圖片盜鏈的實例,很實用哦!