背景: 一個請求在到達處理器時 可能需要做很多重複的工作 比如使用固定的算法推算出用戶id 角色 如果在應用程序各處做重複解析 會產生大量代碼冗餘 還有能想到的諸如記錄訪問者 應用日誌 統計流量 等等....
自定義作用: asp.net 框架設計時 除了提供如 mvc webfrom 等高層次框架 還提供了底層接口 如Ihttphandler Ihttpmodule 通過重新實現這些接口定製符合自己業務需要的應用程序 可以節省一些重複工作 通過統一的管道進行處理 更有利於代碼結構不復雜化
第一步:
創建一個cs文件 繼承自IHttpModule
實現IHttpModule的init方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
using System; using System.Collections.Generic; using System.Linq; using System.Web; namespace WebApplication1 { internal class myModule : IHttpModule { public void Init(HttpApplication app) { app.BeginRequest += new EventHandler(app_BeginRequest); } void app_BeginRequest( object sender, EventArgs e) { HttpApplication app = (HttpApplication)sender; app.Response.Write( "玩一下" ); } public void Dispose() { } } } |
以上代碼是實現了一個IHttpModule的類 它的功能是向管道BeginRequest事件添加一個調用函數(可以有多個 進行多播調用) 該事件是進入管道的第一個事件 在request初始化後調用
第二步:
在web.config文件中指定當前HttpAppliation使用的module
iis6級以下版本在httpModules節點下添加子節點 <!--<add name="myModule" type="WebApplication1.myModule"/>-->
我這裏使用的是iis7以上版本 添加子節點到 <add name="myModule" type="WebApplication1.myModule"/> 到system.webServer下子節點modules下,這裏的type路徑要注意,是命名空間加類名
運行效果
- BeginRequest #發出信號表示創建任何給定的新請求。 此事件始終被引發,並且始終是請求處理期間發生的第一個事件
- AuthenticateRequest #發出信號表示配置的身份驗證機制已對當前請求進行了身份驗證。 訂閱 AuthenticateRequest 事件可確保在處理附加模塊或事件處理程序之前對請求進行身份驗證
- PostAuthenticateRequest #預訂 PostAuthenticateRequest 事件的功能可以訪問由 PostAuthenticateRequest 處理的任何數據
- AuthorizeRequest #發出信號表示 ASP.NET 已對當前請求進行了授權。 訂閱 AuthorizeRequest 事件可確保在處理附加的模塊或事件處理程序之前對請求進行身份驗證和授權
- PostAuthorizeRequest #發出信號表示 ASP.NET 已對當前請求進行了授權。 訂閱 PostAuthorizeRequest 事件可確保在處理附加的模塊或處理程序之前對請求進行身份驗證和授權
- ResolveRequestCache #引發這個事件來決定是否可以使用從輸出緩衝返回的內容來結束請求。這依賴於Web應用程序的輸出緩衝時怎樣設置的
- PostResolveRequestCache #在 ASP.NET 跳過當前事件處理程序的執行並允許緩存模塊滿足來自緩存的請求時發生
- MapRequestHandler #ASP.NET 基礎結構使用 MapRequestHandler 事件來確定用於當前請求的請求處理程序
- PostMapRequestHandler #在 ASP.NET 已將當前請求映射到相應的事件處理程序時發生
- AcquireRequestState #當 ASP.NET 獲取與當前請求關聯的當前狀態(如會話狀態)時發生
- PostAcquireRequestState #預訂 AcquireRequestState 事件的功能可以訪問由 PostAcquireRequestState 處理的任何數據
- PreRequestHandlerExecute #在ASP.NET開始執行HTTP請求的處理程序之前引發這個事件。在這個事件之後,ASP.NET 把該請求轉發給適當的HTTP處理程序
- PostRequestHandlerExecute #在 ASP.NET 事件處理程序(例如,某頁或某個 XML Web service)執行完畢時發生
- ReleaseRequestState #在 ASP.NET 執行完所有請求事件處理程序後發生。 該事件將使狀態模塊保存當前狀態數據
- PostReleaseRequestState #在 ASP.NET 已完成所有請求事件處理程序的執行並且請求狀態數據已存儲時發生
- UpdateRequestCache #當 ASP.NET 執行完事件處理程序以使緩存模塊存儲將用於從緩存爲後續請求提供服務的響應時發生
- PostUpdateRequestCache #在 ASP.NET 完成緩存模塊的更新並存儲了用於從緩存中爲後續請求提供服務的響應後,發生此事件
- OnLogRequest #恰好在 ASP.NET 爲當前請求執行任何記錄之前發生,即使發生錯誤,也會引發 LogRequest 事件
- PostLogRequest #在 ASP.NET 處理完 LogRequest 事件的所有事件處理程序後發生
- EndRequest #在 ASP.NET 響應請求時作爲 HTTP 執行管線鏈中的最後一個事件發生
- PreSendRequestContent #恰好在 ASP.NET 向客戶端發送內容之前發生,可能發生多次
- PreSendRequestHeaders #恰好在 ASP.NET 向客戶端發送 HTTP 標頭之前發生
- RequestCompleted #在任何託管模塊和處理程序執行後,它使模塊清理資源
以上是可以註冊的事件列表 執行順序與列表順序相同
訪問一個頁面的過程中,依次觸發23個事件,HttpModule可訂閱的事件個數爲25個, Error事件在發生錯誤的情況下執行 Disposed在會話結束後觸發。