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请求处理过程

 

ASPNETHTTP

 

说明: 
(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

  


复制代码

 

这里的每个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

  

  


复制代码

 

下面是自己定义的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

  

复制代码

 

置文件如下

<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

  


复制代码

具体运行结果如下:

今天就写到这里吧,文章页有些长了,不过HttpModule还没有介绍完呢,如果您对我的文章感兴趣的话请继续关注我的下篇,下篇我们将继续介绍HttpModule这个东东的。

分类:  ASP.NET

本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/p/3179988.html ,如需转载请自行联系原作者
相关文章
|
前端开发 .NET 开发框架
ASP.NET Core 2 学习笔记(二)生命周期
原文:ASP.NET Core 2 学习笔记(二)生命周期 要了解程序的运行原理,就要先知道程序的进入点及生命周期。以往ASP.NET MVC的启动方式,是继承 HttpApplication 作为网站开始的进入点,而ASP.NET Core 改变了网站的启动方式,变得比较像是 Console Application。
1084 0
|
前端开发 .NET
ASP.NET MVC5请求管道和生命周期
请求处理管道 请求管道是一些用于处理HTTP请求的模块组合,在ASP.NET中,请求管道有两个核心组件:IHttpModule和IHttpHandler。所有的HTTP请求都会进入IHttpHandler,有IHttpHandler进行最终的处理,而IHttpModule通过订阅HttpApplication对象中的事件,可以在IHttpHandler对HTTP请求进行处理之前对请求进行预处理或IHttpHandler对HTTP请求处理之后进行再次处理。
1237 0
|
.NET 开发框架 存储
[译] ASP.NET 生命周期 – ASP.NET 请求生命周期(三)
使用特殊方法处理请求生命周期事件 为了在全局应用类中处理这些事件,我们会创建一个名称以 Application_ 开头,以事件名称结尾的方法,比如 Application_BeginRequest。举个例子,就像 Application_Start 和 Application_End 方法,ASP.NET 框架就会在事件触发的时候找到这些函数并触发它。
838 0
|
Web App开发 前端开发 .NET
[译] ASP.NET 生命周期 – ASP.NET 请求生命周期(二)
ASP.NET 请求生命周期 全局应用类也可以用来跟踪每个独立请求的生命周期,包括请求从 ASP.NET 平台传递到 MVC 框架。ASP.NET 框架会创建一个定义在 Global.asax 文件中的 MvcApplication 类的实例,并使用它当中定义的事件来引导请求,直到产生响应并发送到浏览器中。
1213 0
|
Web App开发 前端开发 .NET
[译] ASP.NET 生命周期 – ASP.NET 应用生命周期(一)
概述 ASP.NET 平台定义了两个非常重要的生命周期。第一个是 应用生命周期  (application life cycle),用来追踪应用从启动的那一刻到终止的那一刻。另一个就是 请求生命周期 (request life cycle),它定义了 HTTP 请求在 ASP.NET 平台中首次接收到,到最终响应发出之间的路径。
1221 0
|
.NET 程序员 开发框架
asp.net生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq1010885678/article/details/37540769 当用户起一个请求到服务器,服务器接收到请求并将该页面返回给浏览器。
893 0
|
.NET
ASP.NET页面生命周期与应用程序生命周期
ASP.NET页面生命周期与应用程序生命周期 页面生命周期 页面生命周期执行一系列步骤:页面的初始化、实例化控件、还原和维护状态、运行事件处理程序代码、呈现。
826 0
|
.NET 开发者 开发框架
记不住ASP.NET页面生命周期的苦恼
介绍 对于ASP.NET开发者,理解ASP.NET的页面生命周期是非常重要的。主要是为了搞明白在哪里放置特定的方法和在何时设置各种页面属性。但是记忆和理解页面生命周期里提供的事件处理方法(method)非常困难。
869 0