註冊Httpmodule可讓咱們使用HttpApplication對象中的處理管道事件。目前你們所熟知的應該有2種方式來使用HttpApplication對象中的處理管道事件。第一種是經過Global.asax全局文件,另一種是經過配置文件來註冊httpmodule。那麼有這2種方式啦,爲何還要有今天這篇博客呢?git
這裏我也提1個簡單的問題,用實例來證實下動態註冊httpmodule的可取之處。數據庫
若是你要寫一個.net框架,供公司全部mvc項目使用,那麼你的框架集成的衆多功能中,至少應該須要一個異常記錄的功能吧,有啦這個功能以後,別人的項目即使忘記處理異常信息,那麼框架也會幫忙一個不拉的將項目異常信息寫入框架的日誌當中,還有你的框架要叼,怎麼叼呢?叼到別人不須要寫如一行代碼便可實現這樣的功能,哇咔,怎麼實現?在你的框架中,只須要幾行代碼便可。mvc
首先咱們利用ilspy來看下Microsoft.Web.Infrastructure.dll這個類庫是幹什麼的,如圖:app
[SecuritySafeCritical] public static void RegisterModule(Type moduleType) { if (DynamicModuleReflectionUtil.Fx45RegisterModuleDelegate != null) { DynamicModuleReflectionUtil.Fx45RegisterModuleDelegate(moduleType); return; } DynamicModuleUtility.LegacyModuleRegistrar.RegisterModule(moduleType); }
那看到此類庫的源碼以後,即可以順藤摸瓜,看清其真面目啦。框架
思考一下上面個人命題,是在項目中一行代碼不用即可執行咱們的類庫,那麼動態註冊HttpModule有啦,接下來就是怎麼一行代碼不寫,就能運行咱們的類庫呢?這就用到啦微軟提供的PreApplicationStartMethodAttribute 屬性。學習
呢,這個類庫能夠動態註冊HttpMoudle,他還實現不修改全局文件就能夠加入,Application_Start()/Shutdown()事件,源碼你可使用ilspy查看,也有項目的git地址,經過nuget能夠獲取,值得你去研究下。spa
[assembly: WebActivatorEx.PreApplicationStartMethod(typeof(RoutingCore.PreApplicationStartRegist), "PreStart")] namespace RoutingCore { public class PreApplicationStartRegist { private static bool hasLoaded; public static void PreStart() { if (!hasLoaded) { hasLoaded = true; DynamicModuleUtility.RegisterModule(typeof(RoutingModule)); } } } }
public class RoutingModule : IHttpModule { public void Init(HttpApplication context) { context.BeginRequest += new EventHandler(context_BeginRequest); context.Error += new EventHandler(context_ErrorRequest); } void context_BeginRequest(object sender, EventArgs e) { } void context_ErrorRequest(object sender, EventArgs e) { HttpApplication ap = sender as HttpApplication; var error = ap.Server.GetLastError(); var code = (error is HttpException) ? (error as HttpException).GetHttpCode() : 500; if (code != 404) { } // 寫入本地文件,隊列或數據庫 // ... ap.Server.ClearError(); ap.Response.Write(error.Message); ap.Response.End(); } public void Dispose() { } }
這個做用遠不止與這裏的異常記錄,對於寫框架來講,他的用處能夠說是大大的,你本身參悟吧。.net
接下來是你們最喜歡的總結內容啦,內容有三,以下:日誌
一、但願能關注我其餘的文章。code
二、博客裏面有沒有很清楚的說明白,或者你有更好的方式,那麼歡迎加入左上方的2個交流羣,咱們一塊兒學習探討。
三、你能夠忘記點贊加關注,但千萬不要忘記掃碼打賞哦。