手机版

Mvc动态注册HttpModule详细说明

时间:2021-09-05 来源:互联网 编辑:宝哥软件园 浏览:

前言

注册Httpmodule允许我们使用HttpApplication对象中的来处理管道事件。目前众所周知,在HttpApplication对象中使用处理管道事件应该有两种方式。第一种是通过Global.asax全局文件,另一种是通过配置文件注册httpmodule。所以,有两种方法。为什么今天会有这个博客?

这里我也问一个简单的问题,用一个例子来证明动态注册httpmodule的好处。

如果你想为公司所有的mvc项目编写一个. net框架,你至少应该在集成在你的框架中的众多函数中需要一个异常记录函数。有了这个功能,即使别人的项目忘记处理异常信息,框架也会帮你把项目的异常信息写入框架的日志中,而不用拉它。仍然需要您的框架。怎么做?不用写一行代码就可以实现这个功能。哇,怎么会?在您的框架中,您只需要几行代码。

微软。Web.Infrastructure.dll和preapplications startmethod attribute属性

首先,我们使用ilspy来查看Microsoft.Web.Infrastructure.dll类库的功能,如图所示:

[securitysafeccritical]public static void register module(Type moduleType){ if(dynamic modulerelationutil。Fx45RegisterModuleDelegate!=null){ DynamicModuleReflectionUtil。fx45 registermoduledelegate(moduleType);返回;}DynamicModuleUtility。legacymuleregisterr . register module(Moduletype);}看到这个类库的源代码后,可以循迹而行,看到它的真面目。

微软。这个命名空间我们可以看到它是动态模块的助手。DynamicModuleUtility类是一个实用类。打开后,你会看到一个醒目的方法,RegisterModule,register module。是的,它是动态注册HttoModule的方法。想一想我上面的命题,就是在项目中,一行代码可以不使用就执行我们的类库,所以需要动态注册HttpModule,那么不写一行代码怎么运行我们的类库呢?这将使用微软提供的preapplicationstartmethod attribute属性。

preapplications startmethod attribute:该属性也可以是有意义的,即在应用程序启动之前要运行的方法。也就是说,它也是程序的入口点,在应用程序初始化之前就启动了。它是一切事物开始时的第一件事。让它成为人造的。这是一个类库。微软提供了预应用程序开始方法属性功能。微软Nuget开发团队成员David Ebbo写了这个比较尴尬的类库。内容如下

此外,这个类库可以动态注册HttpMoudle,它可以在不修改全局文件Application_Start()/Shutdown()的情况下加入事件。可以用ilspy查看源代码,还有项目的git地址,可以通过nuget获取,值得研究。

代码实现动态注册HttpMoudle

[assembly: WebActivatorEx .PreApplicationStartMethod(类型为(路由中心.preapplications startregist),' PreStart ')]命名空间路由核心{ public class pre applications startregist { private static bool HasLoaded;public static void PreStart() { if(!hasLoaded){ hasLoaded=true;动态可调性.注册模块(路由模块的类型);} } } }公共类routing module : ihttpm module { public void Init(Httpapplication context){ context .begin request=新的事件处理程序(context _ begin request);语境。错误=新的事件处理程序(context _ error请求);} void context_BeginRequest(对象发送方,事件参数e){ } void context _ error请求(对象发送方,事件参数e){ Http application AP=sender as Http application;定义变量误差=ap .服务器。GetLastError();定义变量代码=(错误为HttpException)?(错误为HttpException).GetHttpCode(): 500;如果(代码!=404) { } //写入本地文件,队列或数据库//.美联社服务器。ClearError();美联社。响应。写入(错误。消息);美联社。响应。end();} public void Dispose() { } }以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!

版权声明:Mvc动态注册HttpModule详细说明是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。