Asp.net管道模型之(HttpModules 和 HttpHandler)

上一节我们从大概范围介绍了管道模型的整体流程,我们从其中知道管道最重要的两大组件为:HttpModules 跟 HttpHandler。今天我们着重来介绍一下这两大组件

一:asp.net处理管道

从请求进入ASP.NET工作者进程,直至它到达最终的处理程序之前要经过一系列的步骤和过程,这个步骤和过程称为ASP.NET处理管道。

管道模型使用一个HttpContext对象去描述声明request/response信息。这个对象在HttpApplication和handler之间来回传递。HttpContext对象通过属性来描述request和response信息。下图展示了部分HttpContext类常用的属性。            

二:Module的详解

1:HttpModule:可以看做是一个拦截器,给我们在特定的事件处理请求的机会。HttpModule有很多应用,例如,我们要在每个请求的页面事件前加载Session数据,那么就用到SessionModule等等;

2:asp.net4.0提供了路由机制也是建立在一个UrlRouteModule上面的,它在请求映射到具体程序前拦截,然后重新映射。MVC又是建立在路由机制的基础上的。

3:怎么查看系统默认自带的Module以及怎么配置自定义的module。

A:打开C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config中的web.config,然后找到system.web节点下面的HttpModules下Module,一般系统自带的webconfig不要轻易去修改,因为这个是针对于全局的。如果要修改只需要修改自己项目中的webconfig

B:打开项目所在的webconfig,注释见下图:

4:怎么自定义module

右键 -》添加新项 --》选择Asp.net模块即自己定义的一个module已经创建完成。

module的注册一般都是在Init方法里面来完成的,下面附上自己新定义的module代码:

 1 public class CustomHttpModule : IHttpModule
 2     {
 3         public void Dispose()
 4         {
 5             Console.WriteLine();
 6         }
 7
 8         public event EventHandler CustomHttpModuleHandler;
 9
10         /// <summary>
11         /// 注册动作
12         /// </summary>
13         /// <param name="context"></param>
14         public void Init(HttpApplication application)
15         {
16             #region 为每一个事件,都注册了一个动作,向客户端输出信息
17             application.AcquireRequestState += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "AcquireRequestState        "));
18             application.AuthenticateRequest += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "AuthenticateRequest        "));
19             application.AuthorizeRequest += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "AuthorizeRequest           "));
20             application.BeginRequest += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "BeginRequest               "));
21             application.Disposed += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "Disposed                   "));
22             application.EndRequest += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "EndRequest                 "));
23             application.Error += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "Error                      "));
24             application.LogRequest += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "LogRequest                 "));
25             application.MapRequestHandler += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "MapRequestHandler          "));
26             application.PostAcquireRequestState += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "PostAcquireRequestState    "));
27             application.PostAuthenticateRequest += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "PostAuthenticateRequest    "));
28             application.PostAuthorizeRequest += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "PostAuthorizeRequest       "));
29             application.PostLogRequest += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "PostLogRequest             "));
30             application.PostMapRequestHandler += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "PostMapRequestHandler      "));
31             application.PostReleaseRequestState += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "PostReleaseRequestState    "));
32             application.PostRequestHandlerExecute += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "PostRequestHandlerExecute  "));
33             application.PostResolveRequestCache += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "PostResolveRequestCache    "));
34             application.PostUpdateRequestCache += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "PostUpdateRequestCache     "));
35             application.PreRequestHandlerExecute += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "PreRequestHandlerExecute   "));
36             application.PreSendRequestContent += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "PreSendRequestContent      "));
37             application.PreSendRequestHeaders += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "PreSendRequestHeaders      "));
38             application.ReleaseRequestState += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "ReleaseRequestState        "));
39             application.RequestCompleted += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "RequestCompleted           "));
40             application.ResolveRequestCache += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "ResolveRequestCache        "));
41             application.UpdateRequestCache += (s, e) => application.Response.Write(string.Format("<h1 style=‘color:#00f‘>来自MyCustomModule 的处理,{0}请求到达 {1}</h1><hr>", DateTime.Now.ToString(), "UpdateRequestCache         "));
42             #endregion
43         }
44     }

自己定义的module已经完成,这样创建完成后,module还不会生效,如果想要其生效,需要在webconfig中的<system.webServer>(因为是该节点是针对于IIS中的集成模式)节点中配置:

<add name="CustomHttpModule" type="Ruanmou.MVC5.Utility.Pipeline.CustomHttpModule,Ruanmou.MVC5"/>

这样既可生效。具体详细配置见上面的第3点

5:怎么看当前请求中运用到了哪些module以及事件呢,可以通过下面代码来查看:

 1  public ActionResult Module()
 2  {
 3      HttpApplication app = base.HttpContext.ApplicationInstance;
 4
 5      #region 得到当前请求中所有的Event事件
 6      List<SysEvent> sysEventsList = new List<SysEvent>();
 7      int i = 1;
 8      foreach (EventInfo e in app.GetType().GetEvents())
 9      {
10          sysEventsList.Add(new SysEvent()
11          {
12              Id = i++,
13              Name = e.Name,
14              TypeName = e.GetType().Name
15          });
16      }
17      #endregion
18
19      #region 得到当前HttpApplication中所有的module,包括系统自带跟自己自定义的
20      List<string> list = new List<string>();
21      foreach (string item in app.Modules.Keys)
22      {
23          list.Add($"{item}: {app.Modules.Get(item)}");
24      }
25      #endregion
26
27      ViewBag.Modules = string.Join(",", list);
28      return View(sysEventsList);
29  }

三:管道中19个标准事件

1:HttpHandler:可以看做一个处理器,它负责处理请求,输出数据。aspx,ashx或者说实现了IHttpHandler的都是HttpHandler。

2:系统的web.config配置的默认的对应的处理器。是根据后缀名然后映射到不同的处理器上面

随便找一个.aspx对应的handler,通过反编译会得到证实

3:系统自带默认的事件

四:总结

MVC URLRouting Module对进入server的request进行了拦截,然后对request的handlerjinxingltes的处理。asp.net WebForm和asp.net MVC两者的不同,是在于最终使用的IHttpHandle的不同。WebForm中使用的是Page这个Handler,MVC中使用的是MVCHander。

原文地址:https://www.cnblogs.com/loverwangshan/p/11195554.html

时间: 2024-10-10 17:03:30

Asp.net管道模型之(HttpModules 和 HttpHandler)的相关文章

Asp.net管道模型(管线模型)

前言 为什么我会起这样的一个标题,其实我原本只想了解asp.net的管道模型而已,但在查看资料的时候遇到不明白的地方又横向地查阅了其他相关的资料,而收获比当初预想的大了很多. 有本篇作基础,下面两篇就更好理解了: 理解并自定义HttpHandler 理解并自定义HttpModule 目录 一般不写目录,感觉这次要写的东西有些多就写一个清晰一下吧. 1.Asp.net管道模型: 2.进程的子进程与进程的线程: 3.应用程序域(AppDomain): 4.IIS5.x下一个HTTP请求/响应过程的整

关于asp.net mvc中的httpModules 与 httpHandler

ASP.NET对请求处理的过程: 当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给ASPNET_ISAPI.dll,ASPNET_ISAPI.dll会通过http管道(Http PipeLine)将请求发送给ASPNET_WP.exe进程,在ASPNET_WP.exe进程中通过HttpRuntime来处理这个请求,处理完毕将结果返回客户端. inetinfo.exe进程:是www服务的进程,IIS服务和ASPNET

asp.net管道模型

查了很多资料,终于大概弄懂管道模型(注意并非指定是asp.net范畴)是个什么概念了,其实就是从Unix移植过来的一种概念,也可以说是一种模式吧(只允许一头读,一头写,并且读完了就会自动消失). asp.net的管道模型中包括HttpApplication的19个管道事件,其实HttpApplication并不负责这19个管道事件,只是在恰当的时机触发这19个管道事件而已. 以下图截图自:https://www.hitoy.org/pipe-aplication-in-linux.html 以下

Owin管道与asp.net管道模型

最近一直没搞懂在 mvc5框架中 为什么存在 Global.asax.cs和Startup.cs 文件... 然后搜索下面文章: http://stackoverflow.com/questions/20168978/do-i-need-a-global-asax-cs-file-at-all-if-im-using-an-owin-startup-cs-class-and 其中提到 1.Application_Start 会比Startup.Configuration 先启动 2.mvc4 版

ASP.NET路由模型解析

大家好,我又来吹牛逼了 ~-_-~ 转载请注明出处:来自吹牛逼之<ASP.NET路由模型解析> 背景:很多人知道Asp.Net中路由怎么用的,却不知道路由模型内部的运行原理,今天我就给大家吹下ASP.NET的路由模块是如何工作的. ps:这是针对ASP.NET4.5版本的,好像在最新的5.0版本中加入了OWIN,彻底解耦了和Web服务器的耦合,我还没有研究过,不敢妄言4.5的模型适用5.0.(是不是被我严谨的态度震慑了_-_) action*0x1:大话ASP.NET模型 首先我们先来了解下一

ASP.NET 管道事件与HttpModule, HttpHandler简单理解 -摘自网络

第一部分:转载自Artech  IIS与ASP.NET管道 ASP.NET管道 以IIS 6.0为例,在工作进程w3wp.exe中,利用Aspnet_ispai.dll加载.NET运行时(如果.NET运行时尚未加载).IIS 6引入了应用程序池的概念,一个工作进程对应着一个应用程序池.一个应用程序池可以承载一个或者多个Web应用,每个Web应用映射到一个IIS虚拟目录.与IIS 5.x一样,每一个Web应用运行在各自的应用程序域中. 如果HTTP.SYS接收到的HTTP请求是对该Web应用的第一

ASP.NET Web API 管道模型

ASP.NET Web API 管道模型 前言 ASP.NET Web API是一个独立的框架,也有着自己的一套消息处理管道,不管是在WebHost宿主环境还是在SelfHost宿主环境请求和响应都是从消息管道经过的,这是必经之地,本篇就为大家简单的介绍一下ASP.NET Web API框架中的管道对象模型. ASP.NET Web API路由.管道 ASP.NET Web API 开篇介绍示例 ASP.NET Web API 路由对象介绍 ASP.NET Web API 管道模型 ASP.NE

谈谈IIS与ASP.NET管道

作为一个Asp.Net平台开发者,非常有必要了解IIS和Asp.Net是如何结合,执行我们的托管代码,以及Asp.Net管道事件的. 本节目录 IIS 5.X IIS 6 IIS 7+ 集成模式 Asp.Net管道 HttpModule HttpHandle IIS 5.x InetInfo.exe与W3SVC服务 IIS 5.x运行在进程InetInfo.exe中,在该进程中一个最重要的服务就是名为World Wide Web Publishing Service(简称W3SVC)的Windo

浅谈管道模型(Pipeline)

本篇和大家谈谈一种通用的设计与处理模型--Pipeline(管道). Pipeline简单介绍 Pipeline模型最早被使用在Unix操作系统中.据称,假设说Unix是计算机文明中最伟大的发明,那么,Unix下的Pipe管道就是尾随Unix所带来的还有一个伟大的发明[1].我觉得管道的出现,所要解决的问题,还是软件设计中老生常谈的设计目标--高内聚,低耦合.它以一种"链式模型"来串接不同的程序或者不同的组件,让它们组成一条直线的工作流.这样给定一个完整的输入,经过各个组件的先后协同处