码迷,mamicode.com
首页 > Web开发 > 详细

asp.net IHttpModule浅析

时间:2019-01-13 18:08:54      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:tst   浅析   init   alc   protected   style   index   handle   图片   

在asp.net程序中,我们除了使用系统自带的HttpModule模块,还可以自己定义一些自己的HttpModule接口模块。一个asp.net程序可以接收多个HttpModule模块。

众所周知,asp.net web有19个管道事件,我们除了可以在Global.asax中实现其中的某些管道事件,还可以通过IHttpModule接口实现这些管道事件。

一、定义自己的HttpModule模块

新建一个framework类库项目,新增一个OutsideMyModule类,并继承IHttpModule接口。代码如下所示:

    //HttpModule无法注册和响应Session 事件,Session事件只能在Global.asax中注册
    public class OutsideMyModule : IHttpModule
    {
        //IHttpModule可以暴露出自定义的事件,在web程序的Global.asax中,
        //以 模块名称_事件名称 的方式实现事件的内容,其中模块名称是在web.config注册的模块名称,并不是模块自己的类名称        
        public event EventHandler ExposedEvent;

        public void Init(HttpApplication context)
        {
            context.BeginRequest += Context_BeginRequest;
        }

        private void Context_BeginRequest(object sender, EventArgs e)
        {
            var application = sender as HttpApplication;
            var items = application.Request.RequestContext.HttpContext.Items;
            if (!items.Contains(ConstString.RequestId))
                items[ConstString.RequestId] = Guid.NewGuid().ToString("N");
            application.Response.Write("OutsideMyModule‘BeginRequest->");
            OnExposeEvent(e);
        }

        protected void OnExposeEvent(EventArgs e)
        {
            if (ExposedEvent != null)
                ExposedEvent(this, e);
        }

        public void Dispose()
        {
            //throw new NotImplementedException();
        }
    }

 

二、使用HttpModule模块

新建一个web项目,引用上面那个项目,并在web.config中配置如下:

技术分享图片

这里有一个需要注意的地方,如果IIS中的应用程序模式使用集成模式,则需要在system.webServer节点中配置,如果需要使用经典模式,则需要在system.web节点中配置。

这样就将我们自定义的HttpModule模块加入到了web项目中。

 

 三、在web项目的Global.asax中实现我们自定义HttpModule模块中暴露出的事件

我们可以在自定义的HttpModule模块中定义自己的事件,并在Global.asax中去实现该事件。

web项目中Global.asax文件中的代码如下所示:

  public class WebApiApplication : System.Web.HttpApplication
    {
        protected void Application_Start()
        {
            GlobalConfiguration.Configure(WebApiConfig.Register);           
        }
//Global.asax是一个全局文件,他可以注册应用程序和Session事件,还可以注册HttpModule中暴露的事件(包括内置的HttpModule和自定义的HttpModule) //HttpModule无法注册和响应Session 事件,Session事件只能在Global.asax中注册 //IHttpModule可以暴露出自定义的事件,在web程序的Global.asax中, //以 模块名称_事件名称 的方式实现事件的内容,其中模块名称是在web.config注册的模块名称,并不是模块自己的类名称 protected void outsideMyModule_ExposedEvent(object sender,EventArgs e) { Response.Write(" myTestModule_ExposeEvent "); } }

接着我们定义一个api接口来看看结果。api接口的定义如下代码:

 public class ModulesController : ApiController
    {
        [HttpGet]
        public async Task<string> Index()
        {
            var requestId = (string)HttpContext.Current.Items[ConstString.RequestId]??"no requestId";
            return await Task.FromResult(requestId);
        }
    }

接着运行程序,看看结果:

技术分享图片

 

asp.net IHttpModule浅析

标签:tst   浅析   init   alc   protected   style   index   handle   图片   

原文地址:https://www.cnblogs.com/williamwsj/p/10263310.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!