一:簡要介紹一下asp.net的執行步驟
1.IIS接收到客戶請求
2. IIS把請求交給aspnet_isapi.dll處理
3.(如果是第一次運行程式)裝載bin目錄中的dll
4.(如果是第一次運行程式)讀取各級webconfig中的配置
5.(如果是第一次運行程式)編譯裝載global.asax,初始化HttpApplication執行個體
6.建立響應請求的HttpContext
7.建立承載響應結果的HttpTextWriter
8.找到合適的HttpHandler(asp.net頁面),處理http請求
9.處理session,異常
10.把處理結果反饋個客戶
當HttpApplication執行個體建立後,
會調用InitModules()方法,
這個方法會根據webconfig檔案中的配置調用相應的HttpModule
這就是可定製的HttpModule
二:通過定製HttpModule來計算頁面執行時間
當HttpApplication建立HttpModule時
將會執行HttpModule的Init方法
在這個方法中,可以訂閱多個事件
如下:
BeginRequest
AuthenticateRequest 當安全模組已建立使用者標識時發生。
PostAuthenticateRequest
AuthorizeRequest 當安全模組已驗證使用者授權時發生。
PostAuthorizeRequest
ResolveRequestCache
PostResolveRequestCache
PostMapRequestHandler
AcquireRequestState
PostAcquireRequestState
PreRequestHandlerExecute
PostRequestHandlerExecute
ReleaseRequestState
PostReleaseRequestState
EndRequest
這些事件也是HttpApplication處理管線中的各種事件
常用的就是BeginRequest和EndRequest
下面我們做一個例子來實現計算頁面的執行時間
先看webconfig的代碼
<?xmlversionxmlversionxmlversionxmlversion="1.0"?>
<configuration>
<system.web>
<httpModules>
<add name="MyModule" type="xland.MyModule"/>
</httpModules>
</system.web>
</configuration>
xland是我建立的一個類庫,命名空間為xland
MyModule為該類庫下的一個類實現了IHttpModules介面
下面看這個類的代碼:
using System;
using System.Collections.Generic;
using System.Web;//引用web命名空間
using System.Text;
namespace xland
{
public class MyModule:IHttpModule//繼承IHttpModules
{
public void Init(HttpApplication application)//實現IHttpModules中的Init事件
{
//訂閱兩個事件
application.BeginRequest +=new EventHandler(application_BeginRequest);
application.EndRequest+=new EventHandler(application_EndRequest);
}
private DateTime starttime;
private void application_BeginRequest(object sender, EventArgs e)
{
//object sender是BeginRequest傳遞過來的對象
//裡面儲存的就是HttpApplication執行個體
//HttpApplication執行個體裡包含HttpContext屬性
starttime = DateTime.Now;
HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;
context.Response.Write("開始計時,現在的時間為:" + starttime.ToString("yyyy年MM月dd日HH:mm:ss.fff") + "<br>");
}
private void application_EndRequest(object sender, EventArgs e)
{
DateTime endtime = DateTime.Now;
HttpApplication application = (HttpApplication)sender;
HttpContext context = application.Context;
context.Response.Write("計時結束,現在的時間為:" + endtime.ToString("yyyy年MM月dd日HH:mm:ss.fff") + "<br>");
context.Response.Write("頁面執行時間:" + (endtime - starttime).ToString());
}
//必須實現dispose介面
public void Dispose() { }
}
}
好其他的都不用管,我們在default.aspx中做一些耗時的操作
注意在web應用程式類庫中一定要添加xland的引用
using System;
using System.Collections;
using System.Configuration;
using System.Data;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
namespace _1
{
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
for (int i = 1; i < 10000; i++)
{
Response.Write(i);
if (i % 100 == 0) { Response.Write("<br>"); }
}
}
}
} BeginRequest和EndRequest裡可以做很多事情
比如處理cookie的domain等
等具體需要的時候要能想到這裡來