asp.net IHttpModule浅析

在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);
        }
    }

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

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

时间: 2024-08-30 10:25:27

asp.net IHttpModule浅析的相关文章

Owin+ASP.NET Identity浅析系列(一)用户登录注册

在今天,读书有时是件"麻烦"事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<Owin+ASP.NET Identity浅析系列>来祭奠那逝去的-- 使用VS2015创建MVC项目运行之后,发现微软很贴心的生成了一套用户授权验证系统,界面也很漂亮,但是扒拉代码一看,囧--新的membership框架,真是太给力了,连数据库表都给你生成了(EF的功劳),问题是,你这一堆一堆的代码,虽然看着很吊(也 确实很吊),但是看着人头大呢,只好研究研究,研究过程记录一下,希望可

Asp.Net Mvc: 浅析TempData机制(转发 作者: Tristan G )

Asp.Net Mvc: 浅析TempData机制 环境: Windows 2008, VS 2008 SP1, Asp.Net Mvc 1.0 ------------------------------------------------------------------------------ 一. Asp.Net Mvc中的TempData 在Asp.Net Mvc框架的ControllerBase中存在一个叫做TempData的Property,它的类型为TempDataDictio

Owin+ASP.NET Identity浅析系列(三)框架结构分析

在今天,读书有时是件"麻烦"事.它需要你付出时间,付出精力,还要付出一份心境.--仅以<Owin+ASP.NET Identity浅析系列>来祭奠那逝去的-- 前两篇博客仅仅说了下功能如何实现,这篇博客来分析IdentityModels.IdentityConfig.Startup.Auth类文件在Owin+ASP.NET Identity框架中起到的作用 IdentityModels类文件存放的是用户.角色.数据库上下文等实体类 IdentityConfig类文件存放的是

asp.net IHttpHandler浅析

在asp.net程序中,我们可以通过配置url的path路径的方式,将某个path路径下的请求交给指定的IHttpHandler去处理,这便是对request请求进行编程. 一.新建一个framework类库 该类库中包含我们需要的IHttpHandler处理程序. 新建一个名为ApiHttpHandler的类,并继承IHttpHandler接口.如下代码: namespace MyHttpHandler { public class ApiHttpHandler : IHttpHandler

Xml命名空间浅析

XML实例 在介绍xml命名空间之前,我们先来看段xml代码: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http:/

php面试题与答案

是什么 ,在什么地方用,注意什么,特点,如何配置(相关关联),出现的问题(缺点),引出解决办法或另一种方法 +- PHP:Hypertext Preprocessor 一.get和post的区别 1. get是从服务器上获取数据,post是向服务器传送数据. 2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到.post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性

大家好

http://www.yugaopian.com/people/259723 http://www.yugaopian.com/people/259744 http://www.yugaopian.com/people/259783 http://www.yugaopian.com/people/259824 http://www.yugaopian.com/people/259839 http://www.yugaopian.com/people/259933 http://www.yugao

阿哥吗卡怪每次哦阿哥看啦过啦嘎开吃麻辣个啊蓝光

http://www.xx186.com/web/web_kpic.asp?id=156613http://www.xx186.com/web/web_kpic.asp?id=156608http://www.xx186.com/web/web_kpic.asp?id=156605http://www.xx186.com/web/web_kpic.asp?id=156602http://www.xx186.com/web/web_kpic.asp?id=156600http://www.xx18

风格更家霍建华

http://www.9ku.com/fuyin/daogaoo.asp?dgid=119864http://www.9ku.com/fuyin/daogaoo.asp?dgid=119867http://www.9ku.com/fuyin/daogaoo.asp?dgid=119876http://www.9ku.com/fuyin/daogaoo.asp?dgid=119879http://www.9ku.com/fuyin/daogaoo.asp?dgid=119883http://www