Asp.Net生命周期系列三
上文讲到了HttpRunTime主要做了三个事情,我们先回忆一下。
第一:雇佣了项目经理(HttpApplication)。
第二:建立了HttpModule列表,项目经理(HttpRunTime)就是按照这个工作列表去工作的。
第三:创建了Context上下文对象(包含了HttpRequest和HttpResponse两大主要对象),并把它转交给了HttpApplication去处理。
下面最重要的是HttpModule到底是个什么东东,HttpApplication又是怎么样按照它的工作列表去工作的。
当一个请求到达HttpModule时,整个Asp.Net系统并没有对这个Http请求做任何的处理,对于一个Http请求,HttpModule是这个请求的必经之路{Asp.Net内部的处理模型是一个管道流,也就是用户发出一个Http请求一定会从HttpModule这个容器中流过},所以我们可以在Http请求真正到达请求处理中心(HttpHandler)之前,添加一些需要的信息在这个Http请求上、或者针对截获的这个Http请求添加一些额外的工作,再或者干脆终止此次Http请求。可见HttpModule就相当于起到一个Filter过滤器的作用。
1、asp.net的HTTP请求处理过程
说明: (1)、客户端浏览器向服务器发出一个http请求,此请求会被inetinfo.exe进程 截获,然后转交给aspnet_isapi.dll进程,接着它又通过Http Pipeline的管道,传送给aspnet_wp.exe这个进程,接下来就到了.net framework的HttpRunTime处理中心,处理完毕后就发送给用户浏览器。 (2)、当一个 http请求被送入到HttpRuntime之后,这个Http请求会继续被送入到一个被称之为HttpApplication Factory的一个容器当中,而这个容器会给出一个HttpApplication实例来处理传递进来的http请求,而后这个Http请求会依次进入 到如下几个容器中:HttpModule --> HttpHandler Factory --> HttpHandler。当系统内部的HttpHandler的ProcessRequest方法处理完毕之后,整个Http Request就被处理完成了,客户端也就得到相应的东东了。 (3)完整的http请求在asp.net framework中的处理流程:
HttpRequest-->inetinfo.exe->ASPNET_ISAPI.DLL-->Http Pipeline-->ASPNET_WP.EXE-->HttpRuntime-->HttpApplication Factory-->HttpApplication-->HttpModule-->HttpHandler Factory-->HttpHandler-->HttpHandler.ProcessRequest()
也就是说一个HTTP请求在HttpModule容器的传递过程中,会在某一时刻(ResolveRequestCache事件)将这个HTTP请 求传递给HttpHandler容器。在这个事件之后,HttpModule容器会建立一个HttpHandler的入口实例,但是此时并没有将HTTP 请求控制权交出,而是继续触发AcquireRequestState事件以及PreRequestHandlerExcute事件。在 PreRequestHandlerExcute事件之后,HttpModule窗口就会将控制权暂时交给HttpHandler容器,以便进行真正的 HTTP请求处理工作。
而在HttpHandler容器内部会执行ProcessRequest方法来处理HTTP请求。在容器HttpHandler处理完毕整个 HTTP请求之后,会将控制权交还给HttpModule,HttpModule则会继续对处理完毕的HTTP请求信息流进行层层的转交动作,直到返回到 客户端为止。
2、HttpModule的工作原理
HttpModule实现了IHttpModule接口,我们可以定义自己类实现IHttpModule接口,从而把我们自己定义的HttpModule插入到HttpModule集合中让它成为Http请求的必经之路,以此来添加我们的控制。
asp.net自带的HttpModule如下:具体位置在C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG文件中
<httpModules><add name="OutputCache" type="System.Web.Caching.OutputCacheModule"/><add name="Session" type="System.Web.SessionState.SessionStateModule"/><add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule"/><add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/><add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule"/><add name="RoleManager" type="System.Web.Security.RoleManagerModule"/><add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule"/><add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule"/><add name="AnonymousIdentification" type="System.Web.Security.AnonymousIdentificationModule"/><add name="Profile" type="System.Web.Profile.ProfileModule"/><add name="ErrorHandlerModule" type="System.Web.Mobile.ErrorHandlerModule, System.Web.Mobile, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/><add name="ServiceModel" type="System.ServiceModel.Activation.HttpModule, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/></httpModules>View Code
<httpModules><add name="OutputCache" type="System.Web.Caching.OutputCacheModule"/><add name="Session" type="System.Web.SessionState.SessionStateModule"/><add name="WindowsAuthentication" type="System.Web.Security.WindowsAuthenticationModule"/><add name="FormsAuthentication" type="System.Web.Security.FormsAuthenticationModule"/><add name="PassportAuthentication" type="System.Web.Security.PassportAuthenticationModule"/><add name="RoleManager" type="System.Web.Security.RoleManagerModule"/><add name="UrlAuthorization" type="System.Web.Security.UrlAuthorizationModule"/><add name="FileAuthorization" type="System.Web.Security.FileAuthorizationModule"/><add name="AnonymousIdentification" type="System.Web.Security.AnonymousIdentificationModule"/><add name="Profile" type="System.Web.Profile.ProfileModule"/><add name="ErrorHandlerModule" type="System.Web.Mobile.ErrorHandlerModule, System.Web.Mobile, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"/><add name="ServiceModel" type="System.ServiceModel.Activation.HttpModule, System.ServiceModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/></httpModules>
这里的每个HttpModule在一个Http请求过来时都会流过。
3、我们可以定义自己的HttpModule
要变成HttpModule就必须实现IHttpModule接口,那么我们先来看看IHttpModule接口的内部是什么样的
using System;namespace System.Web{public interface IHttpModule{// 销毁不再被HttpModule使用的资源void Dispose();// 初始化一个Module,为捕获HttpRequest做准备void Init(HttpApplication context);}}View Code
using System;namespace System.Web{public interface IHttpModule{// 销毁不再被HttpModule使用的资源void Dispose();// 初始化一个Module,为捕获HttpRequest做准备void Init(HttpApplication context);}}
下面是自己定义的HttpModule
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;namespace ClassLibrary1
{public class MyHttpModel:IHttpModule{public void Dispose(){throw new NotImplementedException();}public void Init(HttpApplication context){context.BeginRequest+=new EventHandler(context_BeginRequest);context.EndRequest+=new EventHandler(context_EndRequest);}public void context_BeginRequest(object sender, EventArgs e){HttpApplication application = sender as HttpApplication;HttpContext context = application.Context;HttpResponse response = context.Response;response.Write("这是自定义的HttpModel中的BeginRequest事件产生的。");}public void context_EndRequest(object sender, EventArgs e){HttpApplication application = sender as HttpApplication;HttpContext context = application.Context;HttpResponse response = context.Response;response.Write("这是自定义的HttpModel中的EndRequest事件产生的。");}}
}View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;namespace ClassLibrary1
{public class MyHttpModel:IHttpModule{public void Dispose(){throw new NotImplementedException();}public void Init(HttpApplication context){context.BeginRequest+=new EventHandler(context_BeginRequest);context.EndRequest+=new EventHandler(context_EndRequest);}public void context_BeginRequest(object sender, EventArgs e){HttpApplication application = sender as HttpApplication;HttpContext context = application.Context;HttpResponse response = context.Response;response.Write("这是自定义的HttpModel中的BeginRequest事件产生的。");}public void context_EndRequest(object sender, EventArgs e){HttpApplication application = sender as HttpApplication;HttpContext context = application.Context;HttpResponse response = context.Response;response.Write("这是自定义的HttpModel中的EndRequest事件产生的。");}}
}
置文件如下
<httpModules>
<add name="MyHttpModel" type="ClassLibrary1.MyHttpModel,ClassLibrary1"/>
</httpModules>
请求的Default.aspx.cs文件如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;namespace ClassLibrary1
{public partial class Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){Response.Write("这是Default.aspx页面请求的内容信息。");}}
}View Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;namespace ClassLibrary1
{public partial class Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){Response.Write("这是Default.aspx页面请求的内容信息。");}}
}
具体运行结果如下:
今天就写到这里吧,文章页有些长了,不过HttpModule还没有介绍完呢,如果您对我的文章感兴趣的话请继续关注我的下篇,下篇我们将继续介绍HttpModule这个东东的。
Asp.Net生命周期系列三相关推荐
- Asp.Net生命周期系列二
在上回书开始的时候我们提到博客园的IIS看了一眼我的请求后就直接交给ASP.NET去处理了,并且要求ASP.NET处理完之后返回HTML以供展示. 那么我们不仅要问: 1, IIS肯定是没有眼睛 ...
- Asp.Net生命周期系列一
Asp.Net生命周期对于初级甚至中级程序员来说,一直都是一个难题,很多程序员不了解生命周期,导致使用Asp.Net做开发感觉很不灵活,感觉太多东西被微软封装好了,我们不能改变,其实只要你稍微了解一下 ...
- (转)Asp.Net生命周期系列一
原文地址:http://www.cnblogs.com/skm-blog/archive/2013/07/07/3176713.html Asp.Net生命周期对于初级甚至中级程序员来说,一直都是一个 ...
- 神策数据张涛:企业服务客户全生命周期运营三步曲:执行反馈
本文根据神策数据副总裁张涛关于企业服务客户全生命周期系列的直播内容整理,共 3 篇,本篇主要内容如下: 解决方案的落地与执行 解决方案执行效果反馈与分析 反向检验关键问题和解决方案的有效性 全生命周期 ...
- PPT 下载 | 神策数据张涛:企业服务客户全生命周期运营三步曲客情诊断 解决方案库...
本文根据神策数据副总裁张涛关于企业服务客户全生命周期系列的直播内容整理,共 3 篇,上篇回顾<PPT 下载 | 神策数据张涛:企业服务客户全生命周期运营三步曲总览篇>,本篇主要内容如下: ...
- PPT 下载 | 神策数据张涛:企业服务客户全生命周期运营三步曲总览篇
本文根据神策数据副总裁张涛关于企业服务客户全生命周期系列的直播内容整理,共 3 篇,本篇主要内容如下: 为什么要做企业服务客户全生命周期运营? 客户全生命周期运营存在哪些坑? 面对坑,企业该如何自救? ...
- android 获取活动栈,活动的生命周期系列(1)返回栈
活动的生命周期系列(一)返回栈 生命周期对程序员很重要,特别当我们了解,就可以写出更流畅的程序,更好的来避规性能瓶颈,让我们的APP拥有更好的用户体验.接下来我们来分享一下"返回栈" ...
- Spring bean 实现生命周期的三种解决方案
Spring bean 实现生命周期的三种解决方案 参考文章: (1)Spring bean 实现生命周期的三种解决方案 (2)https://www.cnblogs.com/javawebsoa/a ...
- Activity生命周期的三种状态
生命周期就是一个对象从创建到销毁的过程,每一个对象都有自己的生命周期.同样,Activity也具有相应的生命周期,Activity的生命周期中分为三种状态,分别是运行状态.暂停状态和停止状态.接下来将 ...
最新文章
- 基于WTL自绘 - 表情选择界面
- keepalived热备 keepalived+LVS Haproxy
- 字符串长度(PHP学习)
- html实现websocket协议,HTML5实现WebSocket协议原理浅析
- 现代操作系统原理与实践02:硬件结构
- 【微收藏】FourShadows.js – 时间感知的算法驱动的图标阴影JS库
- python导入模块的方式错误的是,导入模块时的错误处理
- 动态时间规整算法_如何使用动态时间规整算法进行语音识别
- Yarn 调度器Scheduler详解
- 优化模型:钢管订购及运输优化模型
- flash倒计时制作
- 怎样在ps中制作对话气泡?一招教你轻松解决
- CVPR2018 ——(GAN)延时摄影视频的生成
- 【可视化】几个常见的论文图及图名
- 忍者必须死显示无法连接服务器,忍者必须死为什么不能登录
- 海康威视IPCamera图像捕获方法:捕获实时流,将实时流解码成YV12,然后转换成RGB
- GIF转MP4 - 在线将GIF动态图转为MP4视频文件
- 安卓开发实战之app之版本更新升级(DownloadManager和http下载)完整实现
- Java后台+PDF.js 实现pdf分页加载的后端实现
- java关闭ie提示错误_IE或软件加载页中提示脚本错误的解决办法集合
热门文章
- C++使用kahn实现topological sort拓扑排序算法(附完整源码)
- QT的QMutexLocker类的使用
- C++对C的加强之C++中所有的变量和函数都必须有类型
- php 反向截取,反向PHP功能
- 13.2.虚拟化工具--jstat
- SQLite Select 语句(http://www.w3cschool.cc/sqlite/sqlite-select.html)
- 取第N个排序的元素之Mysql存储过程动态SQL order by offset实现案例
- Kettle使用_20 笛卡尔积与前一行后一行Lead Lag
- c语言异或实现交换原理,使用异或运算符实现两个数交换原理
- ubuntu 重装 nvidia_nvidia-smi指令报错:Failed to initialize NVML: Driver解决