欢迎来到.net学习网

欢迎联系站长一起更新本网站!QQ:879621940

您当前所在位置:首页 » ASP.Net » 正文

热门阅读

ASP.NET 重要对象 HttpApplication 详解

创建时间:2011年08月03日 16:20  阅读次数:(4915)
分享到:
前面在讲解如何通过RewritePath方法重写Url地址实现伪静态时用到了HttpApplication对象,本章主要对该对象进行详解

MSDN:定义 ASP.NET 应用程序中的所有应用程序对象共有的方法、属性和事件。 
注意:HttpApplication 非Page属性 Application(HttpApplicationState),Application 为其属性。 
此类是用户在 Global.asax 文件中所定义的应用程序的基类。 
HttpApplication 类的实例是在 ASP.NET 基础结构中创建的,而不是由用户直接创建的。 
使用 HttpApplication 类的一个实例来处理其生存期中收到的众多请求。 
但是,它每次只能处理一个请求。 这样,成员变量才可用于存储针对每个请求的数据。 
应用程序引发的事件可以由实现 IHttpModule 接口的自定义模块处理,也可以由 Global.asax 文件中定义的事件处理程序代码处理。 
可以将实现 IHttpModule 接口的自定义模块放在 App_Code 文件夹中,也可以放在 Bin 文件夹下的某个 DLL 中。 
HttpApplication 是在 .NET Framework 3.5 版中引入的。 

HttpApplication 属性(只读): 
·HttpApplicationState Application: 获取应用程序的当前状态。 详情 
·HttpContext Context:获取关于当前请求的 HTTP 特定信息。 
·HttpSessionState Session:获取提供对会话数据的访问的内部会话对象。 详情 
·HttpRequest Request:获取当前请求所对应的内部请求对象。 
·HttpResponse Response:获取当前请求所对应的内部响应对象。 
·HttpServerUtility Server:获取当前请求所对应的内部服务器对象。 
·ISite Site:获取或设置 IComponent 实现的网站接口。 
·IPrincipal User:获取当前请求的内部用户对象。 
·EventHandlerList Events:获取处理所有应用程序事件的事件处理程序委托列表。 
·HttpModuleCollection Modules:获取当前应用程序的模块集合。 

HttpApplication 事件引发顺序: 
·BeginRequest:在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生。
·AuthenticateRequest:当安全模块已建立用户标识时发生。
·PostAuthenticateRequest:当安全模块已建立用户标识时发生。
·AuthorizeRequest:当安全模块已验证用户授权时发生。
·PostAuthorizeRequest:在当前请求的用户已获授权时发生。
·ResolveRequestCache:在 ASP.NET 完成授权事件以使缓存模块从缓存中为请求提供服务后发生,从而绕过事件处理程序(例如某个页或 XML Web services)的执行。
·PostResolveRequestCache:在 ASP.NET 跳过当前事件处理程序的执行并允许缓存模块满足来自缓存的请求时发生。
·MapRequestHandler:基础结构。在选择了用来响应请求的处理程序时发生。如果服务器在集成模式下运行 IIS 7.0 并且 .NET Framework 至少为 3.0 版本,则会引发该事件。 如果服务器在经典模式下运行 IIS 7.0 或者运行的是较早版本的 IIS,则无法处理此事件。
·PostMapRequestHandler:在 ASP.NET 已将当前请求映射到相应的事件处理程序时发生。
·AcquireRequestState:当 ASP.NET 获取与当前请求关联的当前状态(如会话状态)时发生。
·PostAcquireRequestState:在已获得与当前请求关联的请求状态(例如会话状态)时发生。
·PreRequestHandlerExecute:恰好在 ASP.NET 开始执行事件处理程序(例如,某页或某个 XML Web services)前发生。
·PostRequestHandlerExecute:在 ASP.NET 事件处理程序(例如,某页或某个 XML Web service)执行完毕时发生。
·ReleaseRequestState:在 ASP.NET 执行完所有请求事件处理程序后发生。 该事件将使状态模块保存当前状态数据。
·PostReleaseRequestState:在 ASP.NET 已完成所有请求事件处理程序的执行并且请求状态数据已存储时发生。
·在引发 PostReleaseRequestState 事件之后,现有的所有响应筛选器都将对输出进行筛选。
·UpdateRequestCache:当 ASP.NET 执行完事件处理程序以使缓存模块存储将用于从缓存为后续请求提供服务的响应时发生。
·PostUpdateRequestCache:在 ASP.NET 完成缓存模块的更新并存储了用于从缓存中为后续请求提供服务的响应后,发生此事件。
·LogRequest:恰好在 ASP.NET 为当前请求执行任何记录之前发生。仅在 IIS 7.0 处于集成模式并且 .NET Framework 至少为 3.0 版本的情况下才支持此事件。
·PostLogRequest:在 ASP.NET 处理完 LogRequest 事件的所有事件处理程序后发生。仅在 IIS 7.0 处于集成模式并且 .NET Framework 至少为 3.0 版本的情况下才支持此事件。
·EndRequest:在 ASP.NET 响应请求时作为 HTTP 执行管线链中的最后一个事件发生。

其它事件
·Disposed:在释放应用程序时发生。
·Error:当引发未经处理的异常时发生。

下面的示例演示如何创建自定义 HTTP 模块并将 AcquireRequestState 事件连接到该 HTTP 模块。 HTTP 模块将截获对 Web 应用程序资源的所有请求,从而使您可以筛选客户端请求。 预订 HttpApplication 事件的任何 HTTP 模块都必须实现 IHttpModule 接口。

附:HTTP 模块介绍,说白了就是自定义一个事件监听 HttpApplication 事件。

如下源码,监听所有获取请求状态事件。 
using System;
using System.Web;

namespace Samples.AspNet.CS
{
    public class CustomHTTPModule : IHttpModule
    {
        public CustomHTTPModule()
        {
            // Class constructor.
        }

        // Classes that inherit IHttpModule 
        // must implement the Init and Dispose methods.
        public void Init(HttpApplication app)
        {
            // 获取请求状态时执行 app_AcquireRequestState 方法     
            app.AcquireRequestState += new EventHandler(app_AcquireRequestState);

            // 获取请求状态之后执行 app_PostAcquireRequestState 方法     
            app.PostAcquireRequestState += new EventHandler(app_PostAcquireRequestState);
        }

        public void Dispose()
        {
            // Add code to clean up the
            // instance variables of a module.
        }

        // Define a custom AcquireRequestState event handler.
        public void app_AcquireRequestState(object o, EventArgs ea)
        {
            HttpApplication httpApp = (HttpApplication)o;
            HttpContext ctx = HttpContext.Current;
            ctx.Response.Write(" Executing AcquireRequestState ");
        }

        // Define a custom PostAcquireRequestState event handler.
        public void app_PostAcquireRequestState(object o, EventArgs ea)
        {
            HttpApplication httpApp = (HttpApplication)o;
            HttpContext ctx = HttpContext.Current;
            ctx.Response.Write(" Executing PostAcquireRequestState ");
        }
    }
}


注:在自定义 HTTP 模块中的事件可以发生之前,必须先修改 Web.config 文件中的配置设置,通知 ASP.NET 有关该 HTTP 模块的信息。下面的示例演示 Web.config 文件的 httpModules 节中的相应配置设置。 
以下设置适用于 IIS 7.0 经典模式以及较早的 IIS 版本。 
<configuration >
  <system.web >
    <httpModules >
      <add type="Samples.AspNet.CS.CustomHTTPModule"
        name="CustomHttpModule" / >
      </httpModules >
  </system.web >
</configuration > ·以下设置适用于 IIS 7.0 集成模式。 
<configuration >
  <system.webServer >
    <modules >
      <add type="Samples.AspNet.CS.CustomHTTPModule"
        name="CustomHttpModule" / >
      </modules >
  </system.webServer >
</configuration >
如文章开始所看到的截图!

总结:

来源:http://blog.csdn.net/matchcolor/article/details/5342378
说明:所有来源为 .net学习网的文章均为原创,如有转载,请在转载处标注本页地址,谢谢!
【编辑:Wyf

打赏

取消

感谢您的支持,我会做的更好!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

最新评论

共有评论0条
  • 暂无任何评论,请留下您对本文章的看法,共同参入讨论!
发表评论:
留言人:
内  容:
请输入问题 2+56=? 的结果(结果是:58)
结  果: