最近對頁面的生命週期比較感興趣,看了一些牛人們寫的文章,感覺似懂非懂(仍需要繼續努力^_^).
生命週期中涉及到幾個非常重要的對象:HttpHandler,HttpModule,IHttpHandlerFactory,他們的執行(順序)和IIS又有著莫大的聯絡(回頭琢磨清楚了再補上這一篇)。
大致的執行過程是這樣的:client端發送頁面請求,被IIS的某個進程截獲,它根據申請的頁面尾碼(.aspx)不同,調用不同的頁面處理常式(.asp->asp.dll; .aspx->ISAPI.dll).而頁面處理常式在處理過程中,則要經曆HttpModule,HttpHandler的處理:前者用於頁面處理前和處理後的一些事件的處理,後者進行真正的頁面的處理。
如前所說,HttpModule會在頁面處理前和後對頁面進行處理,所以它不會影響真正的頁面請求。通常用在給每個頁面的頭部或者尾部添加一些資訊(如著作權聲明)等.曾經見過一些免費的空間,我們的頁面上傳上去後,瀏覽的時候發現,在每個頁面的頭部和尾部多了很多小廣告....,如果理解了HttpModule的原理,要做這個就不是很難了~
1.建立一個WebSite
2.建立一個class,命名HttpModuleTest,在這個類裡面對IHttpModule介面進行繼承實現.查看msdn可知道IHttpModule中主要包括這個方法Init(), Dispose().
//Class: HttpModuleTest.cs
//---------------------------------------------
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
/**//// <summary>
/// HttpModuleTest 的摘要描述
/// </summary>
public class HttpModuleTest:IHttpModule
...{
//Init方法用來註冊HttpApplication 事件。
public void Init(HttpApplication application)
...{
application.BeginRequest +=
(new EventHandler(this.Application_BeginRequest));
application.EndRequest +=
(new EventHandler(this.Application_EndRequest));
}
//在頁面處理前執行這個事件方法
private void Application_BeginRequest(Object source,
EventArgs e)
...{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write("<h1><font color=red> HelloWorldModule: Beginning of Request</font></h1><hr>");
context.Response.Write("<a href='http://www.baidu.com'><h2><font color=blue>click here you will see some ads</font></h2></a>");
}
//在頁面處理前執行這個事件方法
private void Application_EndRequest(Object source, EventArgs e)
...{
HttpApplication application = (HttpApplication)source;
HttpContext context = application.Context;
context.Response.Write("<hr><h1><font color=red>HelloWorldModule: End of Request</font></h1>");
}
//資源釋放
public void Dispose()
...{
}
}
//-----------------------------------------------
3.把這個class編譯成Dll:
運行VS2005命令列工具:輸入csc /t:library /r:System.Web.dll D:\Demo\HttpContextDemo\App_Code\HttpModuleTest.cs 而後到D:\Program Files\Microsoft Visual Studio 8\VC 下找到HttpModuleTest.dll,把它複製到當前項目Bin目錄下.
4.配置Web.config,以便處理常式能夠找到我們自訂的httpmodule>
在System.Web下加入:
<httpModules >
<add name="test" type ="HttpModuleTest,HttpModuleTest"/>
</httpModules>
注意:name隨便起名字,type前半部分是實現IHttpModule的類名,後半部分是處理檔案名稱(.Dll名稱).
5.建立頁面運行。
你會發現,無論你運行哪個頁面,除了頁面本文外,在頭部和尾部都會出現額外的自訂資訊。
===========
當然,這個只是一個Demo,在實際的應用中,模組可以訪問當前請求的上下文,我們可以根據上下文資訊對請求執行任何操作》
public class IpFilterModule:IHttpModule
...{
public void Init(HttpApplication context)
...{
context.BeginRequest += new EventHandler(context_BeginRequest);
}
void context_BeginRequest(object sender, EventArgs e)
...{
//在事件處理過程中,我們可以獲得當前請求的上下文,根據請求的上下文,我們可以對
//請求執行任何操作
HttpApplication app = sender as HttpApplication; //獲得當前應用程式
if (app != null)
...{
//app.Context 獲得當前上下文資訊
string hostname = app.Context.Request.UserHostName;
if (hostname!="cc")
...{
app.Context.Response.StatusCode = 404;
app.Context.Response.End();
}
}
}
public void Dispose()
...{
}
}
待續......