MVC 動態註冊HttpModule詳解
來源: 張龍豪
cnblogs.com/knowledgesea/p/6232617.html
序言
註冊Httpmodule可以讓我們使用HttpApplication對象中的處理管道事件。目前大家所熟知的應該有2種方式來使用HttpApplication對象中的處理管道事件。第一種是通過Global.asax全局文件,另外一種是通過配置文件來註冊httpmodule。那麼有這2種方式啦,為什麼還要有今天這篇博客呢?
這裡我也提1個簡單的問題,用實例來證明下動態註冊httpmodule的可取之處。
如果你要寫一個.net框架,供公司所有mvc項目使用,那麼你的框架集成的眾多功能中,至少應該需要一個異常記錄的功能吧,有啦這個功能之後,別人的項目即便忘記處理異常信息,那麼框架也會幫忙一個不拉的將項目異常信息寫入框架的日誌當中,還有你的框架要叼,怎麼叼呢?叼到別人不需要寫如一行代碼即可實現這樣的功能,哇咔,怎麼實現?在你的框架中,只需要幾行代碼即可。
Microsoft.Web.Infrastructure.dll與PreApplicationStartMethodAttribute屬性
首先我們利用ilspy來看下Microsoft.Web.Infrastructure.dll這個類庫是幹什麼的,如圖:
[SecuritySafeCritical]
public static void RegisterModule(Type moduleType)
{
if (DynamicModuleReflectionUtil.Fx45RegisterModuleDelegate != null)
{
DynamicModuleReflectionUtil.Fx45RegisterModuleDelegate(moduleType);
return;
}
DynamicModuleUtility.LegacyModuleRegistrar.RegisterModule(moduleType);
}
那看到此類庫的源碼之後,便可以順藤摸瓜,看清其真面目啦。
Microsoft.Web.Infrastructure.DynamicModuleHelper 此命名空間我們可以看出他是關於動態module的helper 。
DynamicModuleUtility此類便是實用類,那麼打開之後,便看到啦一個醒目的方法,RegisterModule,註冊Module,沒錯他就是動態註冊HttoModule的方法。
思考一下上面我的命題,是在項目中一行代碼不用便可執行我們的類庫,那麼動態註冊HttpModule有啦,接下來就是怎麼一行代碼不寫,就能運行我們的類庫呢?這就用到啦微軟提供的PreApplicationStartMethodAttribute 屬性。
PreApplicationStartMethodAttribute:此屬性也可以望文生義,便是在application啟動之前要運行的方法。就是說他也是一個程序的入口點,並且還是application初始化之前便啟動啦,萬物之初先有的便是它,造作吧。
WebActivatorEx:這是一個類庫,微軟提供啦PreApplicationStartMethodAttribute特性,微軟Nuget開發小組有一個成員David Ebbo寫啦這個更叼的類庫,內容如下圖
呢,這個類庫可以動態註冊HttpMoudle,他還實現不修改全局文件就可以加入,Application_Start()/Shutdown()事件,源碼你可以使用ilspy查看,也有項目的git地址,通過nuget可以獲取,值得你去研究下。
代碼實現動態註冊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)
{
}
// 寫入本地文件,隊列或資料庫
// ...
ap.Server.ClearError();
ap.Response.Write(error.Message);
ap.Response.End();
}
public void Dispose() { }
}
這個作用遠不止與這裡的異常記錄,對於寫框架來說,他的用處可以說是大大的,你自己參悟吧。
你是如何在高樓逃生的?
你被困在一幢200米高的大樓的樓頂。你手裡有一根150米長的繩子和一把瑞士軍刀。你所站的地方有一個鐵鉤子。往樓下看時,你發現大樓正中間,也就是100米高的位置上,有一個可以落腳的金屬支架,上面還有另外一個鉤子。你怎樣才能利用這些東西安全到達地面?
請回對話框發送「逃生」獲取答案。
點擊展開全文


※JVM 診斷調優 CheatSheet
※寫了一百萬行代碼是什麼體驗?
※Web的26項基本概念和技術
※MVC,MVP,MVVM比較以及區別
TAG:程序源 |
※Spring MVC之DispatcherServlet初始化詳解
※從 Spring Boot到 Spring MVC(註解方式)
※SpringMVC + security模塊 框架整合詳解
※Spring MVC接受List Array Map參數
※Identity Server 4-Hybrid Flow-MVC客戶端身份驗證
※Identity Server 4-Hybrid Flow-使用ABAC保護MVC客戶端和API資源
※SpringMVC,Spring,Hibernate框架自動生成器
※Spring4+hibernate+SpringMvc整合
※netty整合springMVC,實現高效的HTTP服務請求
※淺談SpringMVC和MyBatis在應用方面的優勢
※SpringMVC如何與Servlet3整合在一起
※AngularJS中的MVC模式
※SpringMVC工程的web.xml以及其他配置文件
※Spring與SpringMVC的容器關係分析
※搭建SpringMVC(非web.xml文件方式)
※SpringMVC常用註解標籤詳解
※Spring SpringMVC配置Druid數據源(資料庫連接池)
※SpringMVC(輕量級Web框架)
※SpringMVC流程架構
※為什麼 web 開發人員需要遷移到.NET Core,並使用 ASP.NET Core MVC 構建 web和API