Asp.Net高级知识回顾_HttpModule及应用程序生命周期_2

1、HttpModule事件列表web

BeginRequestwindows

指示请求处理开始。api

AuthenticateRequest浏览器

PostAuthenticateRequest缓存

封装请求身份验证过程。安全

AuthorizeRequestapp

PostAuthorizeRequest性能

封装请求受权过程。优化

ResolveRequestCache网站

PostResolveRequestCache

封装检查是否能利用之前缓存的输出页面处理请求的过程。

PostMapRequestHandler

指示已发现用于处理请求的 HTTP 处理程序。

AcquireRequestState

PostAcquireRequestState

封装对请求会话状态的检索。

PostRequestHandlerExecute

指示用于处理请求的 HTTP 处理程序已执行。

ReleaseRequestState

PostReleaseRequestState

封装对请求会话状态的发布。

UpdateRequestCache

PostUpdateRequestCache

封装检查是否应对请求的资源的输出进行缓存以备从此重复使用的过程。

EndRequest

指示请求处理结束。

2、 HttpModule 事件流程

3、建立自定义 HTTP 模块

咱们首先看下IHttpModule接口,它包括下面两个方法:

public void Init(HttpApplication context);

public void Dispose();

Init():这个方法接受一个HttpApplication对象,HttpApplication表明当前的应用程序,咱们须要在这个方法内注册HttpApplication对象暴露给客户端的事件。可见,这个方法仅仅是用来对事件进行注册,而实际的事件处理程序,须要咱们另外写方法。

整个过程很好理解:

1.0  当站点第一个资源被访问时,Asp.Net将建立HttpApplication类的实例,它表明着站点应用程序,同时会建立全部在Web.Config中注册过的Module实例。

2.0  在建立Module实例时会调用Module的Init()方法。

3.0 在Init()方法内,对想要做出响应的HttpApplication暴露出的事件进行注册。(仅仅进行方法的简单注册,实际的方法须要另写)。

4.0  HttpApplication在其应用程序周期中触发各种事件。

5.0 触发事件时调用Module在其Init()方法中注册过的方法。

Dispose():它能够在进行垃圾回收以前进行一些清理工做。

综上所述:实现一个IHttpModule的模板通常是这样的:

public class DefineModule:IHttpModule
{
    public void Init(HttpApplication context) {
       // 注册HttpApplication应用程序 BeginRequest 事件
       // 也能够是其余任何HttpApplication暴露出的事件
       context.BeginRequest += new EventHandler(context_BeginRequest);
    }
    void context_BeginRequest(object sender, EventArgs e) {
       HttpApplication application = (HttpApplication)sender;
       HttpContext context = application.Context;
       // 作些实际的工做,HttpContext对象都得到了,剩下的基本能够自由发挥了
    }
    public void Dispose() {
    }
}

4、注册自定义 HTTP 模块(webconfig)  哪一个HttpModules注册的顺序在前,执行的注册事件的顺序也在前!

1.0 IIS6及IIS7经典模式

<configuration>
  <system.web>
    <httpModules>   <add name="HelloWorldModule" type="HelloWorldModule"/>  
   </httpModules>
  </system.web>
</configuration>

注:type=“命名空间+类别名称,组件名称”

2.0  为在集成模式下运行的 IIS7.0 注册模块

<configuration>
     <system.webServer>    
              <modules>      
                        <add name="HelloWorldModule" type="HelloWorldModule"/>  
            </modules>  
       </system.webServer>
</configuration>
注:type="命名空间+类别名称,组件名称"

5、HttpModule与 Global.asax 文件(新建全局应用程序类)

1.0 Global.asax文件(也称为ASP.NET应用程序文件)是一个可选的文件,该文件包含响应ASP.NET或HTTP模块所引起的应用程序级别和会话级别事件的代码。Global.asax文件驻留在ASP.NET应用程序的根目录中。运行时分析Global.asax 文件,并将其编译到一个动态生成的 .NET Framework类,该类是从HttpApplication基类派生的。配置ASP.NET,以便自动拒绝对Global.asax文件的任何直接URL请求,外部用户不能下载或查看其中的代码,Global.asax文件是可选的,只在但愿处理应用程序事件或会话事件时,才建立它。 

 Global文件的执行:

例如,IIS如今接到一个访问ASP.NET应用程序的请求,这时候IIS会将这个请求映射给aspnet_isapi.dll,aspnet_isapi.dll接到这个请求后,会新建一个aspnet_wp.exe的进程(windows server 2003下是w3wp.exe进程),这个进程将请求传递给一个被指定的AppDomain,当这个AppDomain被建立时,就会加载一些配置文件中的信息(加载顺序是从machine.config文件到web.config文件中的一些相关配置),而当这些信息都被加载之后,AppDomain会去得到一个HttpApplication的实例,这时global类就会被编译加载了,接下来AppDomain会作一些相关的处理建立Page类的实例,最后这个页面呈现到客户端浏览器上。但这里有一点问题须要注意,当配置文件被加载的时候,并非表示AppDomain会加载配置文件中全部的信息,而仅是加载一些须要的信息。而有些配置信息是在须要时,才会被AppDomain加载。例如咱们在web.config文件中配置了不少HttpModule,仅当每个HttpModule被访问到时,AppDomain才会去加载并处理这些信息。因此说web.config文件和global没有前后执行的顺序,只是视具体的信息何时被加载和处理。

Global.asax.cs中的方法的含义:

 Application_Init:在每个HttpApplication实例初始化时执行。

 Application_Disposed:在每个HttpApplication实例被销毁以前执行。

Application_Error:全部没有处理的错误都会致使这个方法的执行。 

 Application_Start:在程序初始化时执行。在Web应用程序的生命周期里就执行一次,这里只能放一些公用的信息,好比HttpApplicationState。
 Application_End:应用程序结束时,在最后一个HttpApplication销毁以后执行。对应Application_Start,在整个生命周期里面也只执行一次。
Session_Start:会话开始时执行。
Session_End:会话结束或过时时执行。
Application_BeginRequest:BeginRequest是在收到Request时第一个触发的事件,这个方法第一个执行。
Application_AuthenticateRequest:当安全模块已经创建了当前用户的标识后执行。
 Application_AuthorizeRequest:当安全模块已经验证了当前用户的受权时执行。
 Application_ResolveRequestCache:当ASP.NET完成受权事件以使缓存模块从缓存中为请求提供服务时发生,从而跳过处理程序(页面或者是WebService)的执行。这样作能够改善网站的性能,这个事件还能够用来判断正文是否是从Cache中获得。
 Application_AcquireRequestState:当ASP.NET获取当前请求所关联的当前状态(如Session)时执行。
 Application_PreRequestHandlerExecute:当ASP.NET即将把请求发送处处理程序对象(页面或者是WebService)以前执行,此时Session就可使用了。
Application_PostRequestHandlerExecute:当处理程序对象工做完成后执行。
 Application_ReleaseRequestState:在ASP.NET执行完全部请求处理程序后执行。ReleaseRequestState事件将使当前状态数据被保存。
Application_UpdateRequestCache:在ASP.NET执行完处理程序后为了后续的请求而更新响应缓存时执行。
Application_EndRequest:同上,EndRequest是在响应Request时最后一个触发的事件,此方法天然就是最后一个执行。
Application_PreSendRequestHeaders:向客户端发送Http标头以前执行。
Application_PreSendRequestContent:向客户端发送Http正文以前执行。

6、 Global与HttpModule的选择

能够在应用程序的 Global.asax 文件中实现HttpModule的许多功能,这使您能够响应应用程序事件。HttpModule相对于Global.asax文件具备以下优势:HttpModule能够进行封装,能够在建立一次后在许多不一样的应用程序中使用。若是将它们添加到全局程序集缓存(GAC)并将它们注册到 Machine.config 文件中,即可以跨应用程序从新使用它们。

使用Global.asax文件有一个好处,那就是能够将代码放在其余已注册的模块事件(如 Session_Start和Session_End方法)中。此外Global.asax 文件还容许实例化,可在整个应用程序中使用全局对象。

当须要建立依赖应用程序事件的代码而且但愿在其余应用程序中重用HttpModule时,或不但愿将复杂代码放在Global.asax文件中时,应当使用HttpModule。当须要建立依赖应用程序事件的代码但不须要跨应用程序重用它时,或者须要订阅不可用于HttpModule的事件(如 Session_Start)时,应当将代码放在 Global.asax 文件中。

7、注意点:HttpModule中哪些过程当中不可使用哪些对象

AcquireRequestState事件以前不能使用Session,由于尚未加载Session状态。

MapHandlerExecutionStep事件以前不能使用缓存,由于没有加载Handler状态。

8、移除没必要要的HttpModule能够优化性能

在.NET Framework 2.0版本的Web.config文件中配置的内置HttpModule,能够根据实际须要移除不须要的HttpModule,从而优化性能。例如,动易产品就根据实际状况移除了下面几个HttpModule:
<remove name="WindowsAuthentication" /> 
启用 Windows 身份验证的状况下设置 ASP.NET 应用程序用户的标识。
<remove name="PassportAuthentication" />
提供围绕 Passport 身份验证服务的包装。
<remove name=" RoleManager" />
管理当前用户的 RolePrincipal 实例。
<remove name="FileAuthorization" />
验证远程用户是否具备访问所请求的文件的权限。
<remove name="AnonymousIdentification" />
管理 ASP.NET 应用程序的匿名标识符。
<remove name="Profile" />
管理用户配置文件和配置文件事件的建立。
相关文章
相关标签/搜索