Mvc動(dòng)態(tài)注冊(cè)HttpModule詳解
序言
注冊(cè)Httpmodule可以讓我們使用HttpApplication對(duì)象中的處理管道事件。目前大家所熟知的應(yīng)該有2種方式來使用HttpApplication對(duì)象中的處理管道事件。第一種是通過Global.asax全局文件,另外一種是通過配置文件來注冊(cè)httpmodule。那么有這2種方式啦,為什么還要有今天這篇博客呢?
這里我也提1個(gè)簡(jiǎn)單的問題,用實(shí)例來證明下動(dòng)態(tài)注冊(cè)httpmodule的可取之處。
如果你要寫一個(gè).net框架,供公司所有mvc項(xiàng)目使用,那么你的框架集成的眾多功能中,至少應(yīng)該需要一個(gè)異常記錄的功能吧,有啦這個(gè)功能之后,別人的項(xiàng)目即便忘記處理異常信息,那么框架也會(huì)幫忙一個(gè)不拉的將項(xiàng)目異常信息寫入框架的日志當(dāng)中,還有你的框架要叼,怎么叼呢?叼到別人不需要寫如一行代碼即可實(shí)現(xiàn)這樣的功能,哇咔,怎么實(shí)現(xiàn)?在你的框架中,只需要幾行代碼即可。
Microsoft.Web.Infrastructure.dll與PreApplicationStartMethodAttribute屬性
首先我們利用ilspy來看下Microsoft.Web.Infrastructure.dll這個(gè)類庫是干什么的,如圖:

[SecuritySafeCritical]
public static void RegisterModule(Type moduleType)
{
if (DynamicModuleReflectionUtil.Fx45RegisterModuleDelegate != null)
{
DynamicModuleReflectionUtil.Fx45RegisterModuleDelegate(moduleType);
return;
}DynamicModuleUtility.LegacyModuleRegistrar.RegisterModule(moduleType);
}
那看到此類庫的源碼之后,便可以順藤摸瓜,看清其真面目啦。
- Microsoft.Web.Infrastructure.DynamicModuleHelper 此命名空間我們可以看出他是關(guān)于動(dòng)態(tài)module的helper 。
- DynamicModuleUtility此類便是實(shí)用類,那么打開之后,便看到啦一個(gè)醒目的方法,RegisterModule,注冊(cè)Module,沒錯(cuò)他就是動(dòng)態(tài)注冊(cè)HttoModule的方法。
思考一下上面我的命題,是在項(xiàng)目中一行代碼不用便可執(zhí)行我們的類庫,那么動(dòng)態(tài)注冊(cè)HttpModule有啦,接下來就是怎么一行代碼不寫,就能運(yùn)行我們的類庫呢?這就用到啦微軟提供的PreApplicationStartMethodAttribute 屬性。
- PreApplicationStartMethodAttribute:此屬性也可以望文生義,便是在application啟動(dòng)之前要運(yùn)行的方法。就是說他也是一個(gè)程序的入口點(diǎn),并且還是application初始化之前便啟動(dòng)啦,萬物之初先有的便是它,造作吧。
- WebActivatorEx:這是一個(gè)類庫,微軟提供啦PreApplicationStartMethodAttribute特性,微軟Nuget開發(fā)小組有一個(gè)成員David Ebbo寫啦這個(gè)更叼的類庫,內(nèi)容如下圖

呢,這個(gè)類庫可以動(dòng)態(tài)注冊(cè)HttpMoudle,他還實(shí)現(xiàn)不修改全局文件就可以加入,Application_Start()/Shutdown()事件,源碼你可以使用ilspy查看,也有項(xiàng)目的git地址,通過nuget可以獲取,值得你去研究下。

代碼實(shí)現(xiàn)動(dòng)態(tài)注冊(cè)HttpMoudle
[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)
{
}
// 寫入本地文件,隊(duì)列或數(shù)據(jù)庫
// ...
ap.Server.ClearError();
ap.Response.Write(error.Message);
ap.Response.End();
}
public void Dispose() { }
}
以上就是本文的全部?jī)?nèi)容,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時(shí)也希望多多支持腳本之家!
相關(guān)文章
ashx介紹以及ashx文件與aspx文件之間的區(qū)別
這篇文章主要介紹了ashx以及ashx文件與aspx文件之間的區(qū)別。需要的朋友可以過來參考下,希望對(duì)大家有所幫助2013-12-12
asp.net AJAX實(shí)現(xiàn)無刷新獲得數(shù)據(jù)
提供一個(gè)使用AJAX實(shí)現(xiàn)無刷新判斷注冊(cè)用戶名是否被注冊(cè)的代碼:2008-11-11
CheckBoxList兩列并排編譯為表格顯示具體實(shí)現(xiàn)
CheckBoxList兩列并排的顯示效果相比大家都有見到過吧,下面是具體的實(shí)現(xiàn)代碼,感興趣的朋友可以參考下哈2013-05-05
ASP.NET?MVC5網(wǎng)站開發(fā)之總體概述(一)
這篇文章主要為大家詳細(xì)介紹了ASP.NET?MVC5網(wǎng)站開發(fā)之總體概述,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-08-08
ASP.NET?MVC5實(shí)現(xiàn)文件上傳與地址變化處理(5)
這篇文章主要介紹了ASP.NET?MVC5實(shí)現(xiàn)文件上傳與地址變化處理,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-09-09
Asp.net開發(fā)之webform圖片水印和圖片驗(yàn)證碼的實(shí)現(xiàn)方法
這篇文章主要介紹了Asp.net開發(fā)之webform圖片水印和圖片驗(yàn)證碼的實(shí)現(xiàn)方法,實(shí)現(xiàn)思路分為前后臺(tái)代碼和效果展示,非常不錯(cuò)具有參考借鑒價(jià)值,需要的朋友可以參考下2016-10-10
asp.net下通過泛解析和偽靜態(tài)實(shí)現(xiàn)二級(jí)域名的實(shí)現(xiàn)方法
當(dāng)我們想做一個(gè)站群或想為每一個(gè)會(huì)員的主頁設(shè)置為一個(gè)二級(jí)域名時(shí),總是想拼命的去找些組件來實(shí)現(xiàn)。2010-10-10
在asp.net中操作sql server數(shù)據(jù)庫的一些小技巧
在asp.net中操作sql server數(shù)據(jù)庫的一些小技巧...2006-09-09

