當前位置:
首頁 > 知識 > MVC 動態註冊HttpModule詳解

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