序言

注册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);
}

那看到此类库的源码之后,便可以顺藤摸瓜,看清其真面目啦。

  1. Microsoft.Web.Infrastructure.DynamicModuleHelper 此命名空间我们可以看出他是关于动态module的helper 。
  2. DynamicModuleUtility此类便是实用类,那么打开之后,便看到啦一个醒目的方法,RegisterModule,注册Module,没错他就是动态注册HttoModule的方法。

思考一下上面我的命题,是在项目中一行代码不用便可执行我们的类库,那么动态注册HttpModule有啦,接下来就是怎么一行代码不写,就能运行我们的类库呢?这就用到啦微软提供的PreApplicationStartMethodAttribute 属性。

  1. PreApplicationStartMethodAttribute:此属性也可以望文生义,便是在application启动之前要运行的方法。就是说他也是一个程序的入口点,并且还是application初始化之前便启动啦,万物之初先有的便是它,造作吧。
  2. 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() { }}

这个作用远不止与这里的异常记录,对于写框架来说,他的用处可以说是大大的,你自己参悟吧。

总结

接下来是大家最喜欢的总结内容啦,内容有三,如下:

1、希望能关注我其他的文章。

2、博客里面有没有很清楚的说明白,或者你有更好的方式,那么欢迎加入左上方的2个交流群,我们一起学习探讨。

3、你可以忘记点赞加关注,但千万不要忘记扫码打赏哦。

转载于:https://www.cnblogs.com/wangsea/p/9565687.html

Mvc动态注册HttpModule详解相关推荐

  1. MVC之前的那点事儿系列(6):动态注册HttpModule

    文章内容 通过前面的章节,我们知道HttpApplication在初始化的时候会初始化所有配置文件里注册的HttpModules,那么有一个疑问,能否初始化之前动态加载HttpModule,而不是只从 ...

  2. linux动态库注册函数,Linux动态库函数的详解

    linux动态库函数的详解 加载动态库 void *dlopen(const char *filename, int flag); flag的可能值: rtld_lazy rtld_now rtld_ ...

  3. ASP.NET MVC Controller激活系统详解:默认实现

    Controller激活系统最终通过注册的ControllerFactory创建相应的Conroller对象,如果没有对ControllerFactory类型或者类型进行显式注册(通过调用当前Cont ...

  4. php动态写入vue,Vue自定义动态组件使用详解

    这次给大家带来Vue自定义动态组件使用详解,Vue自定义动态组件的注意事项有哪些,下面就是实战案例,一起来看一下. 现在基于vue的UI组件库有很多,比如iview,element-ui等.但有时候这 ...

  5. 动态代理机制详解(JDK 和CGLIB,Javassist,ASM)

    2019独角兽企业重金招聘Python工程师标准>>> 在运行时期可以按照Java虚拟机规范对class文件的组织规则生成对应的二进制字节码.当前有很多开源框架可以完成这些功能,如A ...

  6. 不使用配置文件动态注册HttpModule

    在asp.net 4.0中,提供了一种不通过修改配置文件注册Module的方法.从.net3.5开始,新提供的PreApplicationStartMethodAttribute特性可以应用在程序集上 ...

  7. java的动态代理机制详解

    2019独角兽企业重金招聘Python工程师标准>>> 参考资料 1.java的动态代理机制详解 转载于:https://my.oschina.net/Howard2016/blog ...

  8. ASP.NET MVC 的安装过程详解

    ASP.NET MVC 的安装过程详解 如果你的机器上没有任何开发软件,你需要准备的工具有: (1)    Visual_studio_team_system_2008(vs2008) (2)    ...

  9. linux mysql 静态库_Linux静态库与动态库实例详解

    Linux静态库与动态库实例详解 1. Linux 下静态链接库编译与使用 首先编写如下代码: // main.c #include "test.h" int main(){ te ...

最新文章

  1. 我叫Java,2019年总结,大家请查收
  2. 【web开发学习笔记】Structs2 Result学习笔记(三)带參数的结果集
  3. 计算机软件在矿井地质中的应用,(完整版)遥感导论知识点整理(梅安新版)
  4. ant构建项目迁移到gradle_Gradle这么弱还跑来面腾讯?
  5. python os如何创建文件夹_Python怎样创建文件夹,怎样删除文件夹
  6. umts是移动还是联通_联通与电信合建5G:核心网各自建设 5G频率资源共享
  7. 中南大学 科学计算与MATLAB语言 矩阵的特征值与特征向量
  8. python语言通过import_python语言的引入(import)机制简述
  9. How Tomcat Works读书笔记之升级架构
  10. 进击的序列帧 一(两篇)------- 让你的序列帧立体起来!
  11. android不流畅,究其本质
  12. 计算机windows10怎么找word,Win10 word路径在哪?Win10如何修改word路径
  13. 【CIPS 2016】(17章)文字识别 (研究进展、现状趋势)
  14. 基于视觉的机器人抓取: 论文及代码(Vision-based Robotic Grasping: Papers and Codes)
  15. 学习了m脚本,代数方程求解(P104)
  16. 架构师到底要做什么?
  17. 文件重命名的快捷键是什么F2
  18. 台湾 等学位论文下载
  19. Dashed hopes 破灭的希望,新兴国家的出路在何方?经济学人精读
  20. DNS安全 DNS缓存投毒与防护

热门文章

  1. Interpreter解释器模式
  2. 百度智能云虚拟主机搭建ThinkPHP5.0项目
  3. Monkey King - 左偏树
  4. 创建或打开android模拟器时遇到的问题,以及打开后遇到的Failed to install FragmentTest.apk on device 'emulator-5554': timeout
  5. 安装Centos 7系统
  6. LWIP+ENC28J60长时间运行后无法访问外网服务器
  7. spark使用supervisor守护进程
  8. SQL Server 非对称秘钥管理
  9. MySQL中ESCAPE关键字的用法
  10. C语言实现简易三子棋,支持双人对战,电脑可拦截