从请求管道深入剖析HttpModule的实现机制,有图有真相
想要了解底层的原理必须对请求处理过程和页面的生命周期有点了解才方便您入门学习一下内容:
关于请求处理过程和页面的生命周期将会在接下来的日子为大家做一个深入的讲解。
HttpModule的实现机制如下:
1.请求到达ISAPIRuntime 的时候通过ProcessReqeust(下文统称pr ) 方法创建 HttpWrokRequest 对象。
2.在执行ISAPIRuntime 的pr 方法时候,方法内部的HttpRuntime 的pr 方法根据HttpWorkRequest 对象创建了上下文对象 HttpContext 。
3.在HttpRuntime 的 pr 方法内部又通过 HttpApplicationFactory 创建了一个处理应用程序的 HttpApplication 实例。
注意:HttpApplication的创建是根据Global.asax文件编译后的类型,再通过反射的方法创建的实例,由于创建实例的过程非常消耗时间和资源,这个则使用了对象池技术
4.在创建HttpApplication 实例的过程中,内部会调用InitInternal 方法,在这个方法里面 调用了HttpModule 的初始化方法,实现了事件的注册。
注意:在实现事件的注册的过程中,内部会去配置文件里面找是否有配置HttpModule模块,如果有则通过反射注册,没有则继续往下走,直到方法跳出。这个过程就是微软的插件机制的体现。
5.事件注册完之后,HttpApplication实例则开始调用自己的pr 方法开始执行页面的生命周期了。
总结:HttpModule 模块的事件注册,就是在HttpApplication 实例内部调用InitInternal 方法,这个方法里面 调用了HttpModule 的初始化方法,实现了事件的注册。
下面的代码是帮助你理解这个过程:
1、首先定义一个上下文 类 HttpContext
1 using System;2 using System.Collections.Generic;3 using System.Linq;4 using System.Text;5 6 namespace HttpApplicationProcessMethodDemo7 {8 /// <summary>9 /// 上下文 10 /// </summary> 11 public class HttpContext 12 { 13 } 14 }
2.定义两个接口分别为: IHttpHandler 、IHttpModule
using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace HttpApplicationProcessMethodDemo {/// <summary>/// 接口,这个接口主要是在application调用pr方法的时候/// 实现调用具体页面或一般处理程序的pr方法的。 /// </summary>public interface IHttpHandler{void ProcessRequest(HttpContext context);} }
using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace HttpApplicationProcessMethodDemo {/// <summary>/// 接口,这个接口主要模拟在Application 的 InitInternal方法内部实现事件的注册/// </summary>public interface IHttpModule{void Init(HttpApplication application);} }
3、定义一个页面类 Page
using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace HttpApplicationProcessMethodDemo {/// <summary>/// 页面类/// </summary>public class Page:IHttpHandler{/// <summary>/// 实现了IHttpHandler接口/// </summary>/// <param name="context">上下文</param>public void ProcessRequest(HttpContext context){Console.WriteLine("页面的生命周期....");Console.WriteLine("..................");Console.WriteLine("..................");Console.WriteLine("..................");Console.WriteLine("页面的生命周期结束...");}} }
4.定义一个应用程序类 Application
using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace HttpApplicationProcessMethodDemo {public class HttpApplication:IHttpHandler{//初始化方法public void InitInternal(){//从配置文件中读取所有的注册了HttpModule的程序集,然后通过反射出实例,并调用Init方法!!! 下面的MyHttpModule假设是通过反射出来的IHttpModule httpModule = new MyHttpModule();httpModule.Init(this);BindEvent();}//Application 自己的事件响应方法private void BindEvent(){BeginRequest += new EventHandler(HttpApplication_BeginRequest);PostResolveRequestCache += new EventHandler(HttpApplication_PostResolveRequestCache);EndRequest += new EventHandler(HttpApplication_EndRequest);}void HttpApplication_EndRequest(object sender, EventArgs e){Console.WriteLine("application自己的事件响应方法执行了--EndRequest"); }void HttpApplication_PostResolveRequestCache(object sender, EventArgs e){Console.WriteLine("application自己的事件响应方法执行了--PostResolveRequest");}void HttpApplication_BeginRequest(object sender, EventArgs e){Console.WriteLine("application自己的事件响应方法执行了--BeginRequest");}//把此方法看成是 http 请求处理的管道public void ProcessRequest(HttpContext context){//19个事件,23个步骤Console.WriteLine("开始请求"); //触发第一个事件BeginRequest(this, null);//触发第七个事件PostResolveRequestCache(this, null);Console.WriteLine("已经获取缓存");//第七个和第八个事件之间,创建页面对象或一般处理程序IHttpHandler httpHandler = new Page();Console.WriteLine("创建页面对象");//在11 和 12 个事件之间执行pr方法Console.WriteLine("开始执行页面的生命周期");httpHandler.ProcessRequest(context);//最后一个事件EndRequest(this, null);Console.WriteLine("结束请求");}public event EventHandler BeginRequest;public event EventHandler PostResolveRequestCache;public event EventHandler EndRequest;} }
5.模拟请求管道中的执行过程
using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace HttpApplicationProcessMethodDemo {class Program{static void Main(string[] args){//ISAPIRuntime//假设根据请求创建了HttpContext上下文HttpContext context = new HttpContext();//假设从HttpApplicationFactory创建出来HttpApplication application = new HttpApplication();//把所有注册在配置文件中的HttpModule加载并执行其Init方法application.InitInternal();//调用pr方法开始执行页面的pr方法application.ProcessRequest(context);Console.ReadKey();}} }
6.自定义一个HttpModule
using System; using System.Collections.Generic; using System.Linq; using System.Text;namespace HttpApplicationProcessMethodDemo {/// <summary>/// 自定义的HttpModule模块/// </summary>public class MyHttpModule : IHttpModule{/// <summary>/// 实现了IHttpModule接口/// </summary>/// <param name="application"></param>public void Init(HttpApplication application){//注册事件application.BeginRequest += new EventHandler(application_BeginRequest);application.PostResolveRequestCache += new EventHandler(application_PostResolveRequestCache);application.EndRequest += new EventHandler(application_EndRequest);}void application_EndRequest(object sender, EventArgs e){Console.WriteLine("HttpModule注册了EndRequest方法");}void application_PostResolveRequestCache(object sender, EventArgs e){Console.WriteLine("HttpModule注册了PostResolveRequestCache方法");}void application_BeginRequest(object sender, EventArgs e){Console.WriteLine("HttpModule注册了BeginRequest方法");}} }
通过以上的步骤就实现了整个管道的执行过程和HttpModule的实现原理了。
下面是效果图:
转载于:https://www.cnblogs.com/zhaolizhe/p/6936686.html
从请求管道深入剖析HttpModule的实现机制,有图有真相相关推荐
- ASP.NET Core管道深度剖析(2):创建一个“迷你版”的管道来模拟真实管道请求处理流程
从<ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求>我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但 ...
- ASP.NET Core管道深度剖析
ASP.NET管道 以IIS 6.0为例,在工作进程w3wp.exe中,利用Aspnet_ispai.dll加载.NET运行时(如果.NET运行时尚未加载).IIS 6引入了应用程序池的概念,一个工作 ...
- 跟我一起学.NetCore之中间件(Middleware)简介和解析请求管道构建
前言 中间件(Middleware)对于Asp.NetCore项目来说,不能说重要,而是不能缺少,因为Asp.NetCore的请求管道就是通过一系列的中间件组成的:在服务器接收到请求之后,请求会经过请 ...
- .net core 中间件管道底层剖析
.net core 管道(Pipeline)是什么? 由上图可以看出,.net core 管道是请求抵达服务器到响应结果返回的中间的一系列的处理过程,如果我们简化一下成下图来看的话,.net core ...
- 深度剖析Linux内核地址映射机制
深度剖析Linux内核地址映射机制 1.虚拟空间数据结构 2.进程虚拟空间 3.内存映射 视频讲解如下,点击观看: Linux内核开发系列第7讲--深度剖析Linux内核地址映射机制 C/C++ ...
- npm(四):剖析npm包版本管理机制
Nodejs成功离不开 npm 优秀的依赖管理系统.在介绍整个依赖系统之前,必须要了解 npm如何管理依赖包的版本,本章将介绍 npm包 的版本发布规范.如何管理各种依赖包的版本以及一些关于包版本的最 ...
- ASP.NET Core管道深度剖析(3):管道是如何处理HTTP请求的?
我们知道ASP.NET Core请求处理管道由一个服务器和一组有序的中间件组成,所以从总体设计来讲是非常简单的,但是就具体的实现来说,由于其中涉及很多对象的交互,我想很少人能够地把它弄清楚.为了让读者 ...
- ASP.NET Core管道深度剖析(1):采用管道处理HTTP请求
之所以称ASP.NET Core是一个Web开发平台,源于它具有一个极具扩展性的请求处理管道,我们可以通过这个管道的定制来满足各种场景下的HTTP处理需求.ASP. NET Core应用的很多特性,比 ...
- ASP.NET Core管道深度剖析[共4篇]
在<管道是如何处理HTTP请求的?>中,我们对ASP.NET Core的请求处理管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.这样一 ...
最新文章
- Setting Up Tomcat For Remote Debugging
- Kaggle入门五大步,跟着做就对了
- 【C++】 C++标准模板库(十) 双向队列
- 在Linux服务器之间迁移帐号信息
- react脚手架搭建项目目录介绍
- 2020年书法落款_书法落款的基本常识
- 远程LInux和秘钥认证
- jvm 解释器和编译器
- Delphi版本下载合集更新至10.4.1
- 桌球小游戏(java)编程
- HTML简洁自适应个人码农主页源码
- PS如何修改文字,数字以及各种常用操作
- MySQL学习路线指南
- 教程 | 校徽头像制作小程序后端实现
- 工行nc银企互联java代码_C#工行 银企互联demo(NC)
- 【GFFrameWork】管理器和框架启动
- rz后远程服务器没反应,“通过jumpserver远程登录linux服务器,rz上传文件速度过慢”问题的解决...
- Cadence SPB 16. 6 安装步骤
- 公司信息系统架构建设规划
- cass生成曲线要素文件_南方cass绘图软件中的公路曲线设计文件是什么格式
热门文章
- 2021年10大人工智能趋势
- 机器学习性能优化全解
- 「技术综述」有三AI不得不看的技术综述
- 有这么一群人,他们通过AI撬动世界!
- 演硬汉才是布鲁斯威利斯的正事 --- 我看《虎胆追凶》
- python中的装饰器介绍
- SAP LSMW 导入物料主数据报错 - You have not fully maintained the descriptions - 之分析
- 干货丨2017年含金量最高的机器学习技能或知识有哪些?
- torch.roll
- (如何从一个列表中随机抽样)np.random.choice(),random.sample()