游戏技术文章

Mvc动态注册HttpModule详解

时间:2017-2-27 13:18:00  作者:棋牌资源网  来源:棋牌资源网  查看:7744  评论:0
内容摘要: 序言注册Httpmodule可以让我们使用HttpApplication对象中的处理管道事件。目前大家所熟知的应该有2种方式来使用HttpApplication对象中的处理管道事件。第一种是通过Global.asax全局文件,另外一种是通过配置文件来注册httpmod...
 

序言

注册Httpmodule可以让我们使用HttpApplication对象中的处理管道事件。目前大家所熟知的应该有2种方式来使用HttpApplication对象中的处理管道事件。第一种是通过Global.asax全局文件,另外一种是通过配置文件来注册httpmodule。那么有这2种方式啦,为什么还要有今天这篇博客呢?

这里我也提1个简单的问题,用实例来证明下动态注册httpmodule的可取之处。

如果你要写一个.net框架,供公司所有mvc项目使用,那么你的框架集成的众多功能中,至少应该需要一个异常记录的功能吧,有啦这个功能之后,别人的项目即便忘记处理异常信息,那么框架也会帮忙一个不拉的将项目异常信息写入框架的日志当中,还有你的框架要叼,怎么叼呢?叼到别人不需要写如一行代码即可实现这样的功能,哇咔,怎么实现?在你的框架中,只需要几行代码即可。

Microsoft.Web.Infrastructure.dll与PreApplicationStartMethodAttribute属性

首先我们利用ilspy来看下Microsoft.Web.Infrastructure.dll这个类库是干什么的,如图:

Mvc动态注册HttpModule详解

复制代码
[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写啦这个更叼的类库,内容如下图

Mvc动态注册HttpModule详解

呢,这个类库可以动态注册HttpMoudle,他还实现不修改全局文件就可以加入,Application_Start()/Shutdown()事件,源码你可以使用ilspy查看,也有项目的git地址,通过nuget可以获取,值得你去研究下。

Mvc动态注册HttpModule详解

代码实现动态注册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、你可以忘记点赞加关注,但千万不要忘记扫码打赏哦。


标签:Mvc动态注册HttpModule详解 

欢迎加入VIP,【VIP售价:只要288元永久VIP会员】畅享商业棋牌游戏程序下载,点击开通!

下载说明


☉本站所有源码和资源均由站长亲自测试-绝对保证都可以架设,运营!
☉如源码和资源有损坏或所有链接均不能下载,请告知管理员,

☉本站软件和源码大部分为站长独资,资源购买和收集,放心下载!

☉唯一站长QQ:1004003180  [人格担保-本站注重诚信!]

☉购买建议E-mail:1004003180@qq.com   源码收购 E-mail:1004003180@qq.com    

☉本站文件解压密码  【文章内都自带解压密码,每个密码不同!】


本站提供的所有源码,均来源站长提供,仅学习交流 浙ICP备09009969号

由此产生不良后果和法律责任与本站无关,如果侵犯了您的版权,请来信告知 1004003180@qq.com 将及时更正和删除! 

Copyright © 2008-2021 棋牌资源网,你身边的棋牌资源下载站    All Rights Reserved