Mvc动态注册HttpModule详解
2018-06-22 07:45:53来源:未知 阅读 ()
序言
注册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() { } }
这个作用远不止与这里的异常记录,对于写框架来说,他的用处可以说是大大的,你自己参悟吧。
总结
接下来是大家最喜欢的总结内容啦,内容有三,如下:
1、希望能关注我其他的文章。
2、博客里面有没有很清楚的说明白,或者你有更好的方式,那么欢迎加入左上方的2个交流群,我们一起学习探讨。
3、你可以忘记点赞加关注,但千万不要忘记扫码打赏哦。
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- Asp.net MVC SignalR来做实时Web聊天实例代码 2020-03-29
- ASP.NET MVC中jQuery与angularjs混合应用传参并绑定数据 2020-03-29
- ASP.NET MVC Admin主页快速构建 2020-03-23
- Asp.Net MVC4通过id更新表单内容的思路详解 2020-03-19
- MVC数据验证详解 2020-03-14
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash