广

ASP编程

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    HttpModule的认识与深入理解

    2018-04-03 22:12:48 次阅读 稿源:互联网
    零七广告

    HttpModule是向实现类提供模块初始化和处置事件。当一个HTTP请求到达HttpModule时,整个ASP.NET Framework系统还并没有对这个HTTP请求做任何处理,也就是说此时对于HTTP请求来讲,HttpModule是一个HTTP请求的“必经之路”,所以可以在这个HTTP请求传递到真正的请求处理中心(HttpHandler)之前附加一些需要的信息在这个HTTP请求信息之上,或者针对截获的这个HTTP请求信息作一些额外的工作,或者在某些情况下干脆终止满足一些条件的HTTP请求,从而可以起到一个Filter过滤器的作用。

    首先你要实现IHttpModule接口这个接口只有两个方法,一个是Init方法一个Dispose方法.

    using System;

    namespace System.Web
    {
    // Summary:
    // Provides module initialization and disposal events to the implementing class.
    public interface IHttpModule
    {
    // Summary:
    // Disposes of the resources (other than memory) used by the module that implements
    // System.Web.IHttpModule.
    void Dispose();
    //
    // Summary:
    // Initializes a module and prepares it to handle requests.
    //
    // Parameters:
    // context:
    // An System.Web.HttpApplication that provides access to the methods, properties,
    // and events common to all application objects within an ASP.NET application
    void Init(HttpApplication context);
    }
    }

    一个HTTP请求在HttpModule容器的传递过程中,会在某一时刻(ResolveRequestCache事件)将这个HTTP请求传递给HttpHandler容器。在这个事件之后,HttpModule容器会建立一个HttpHandler的入口实例,但是此时并没有将HTTP请求控制权交出,而是继续触发AcquireRequestState事件以及PreRequestHandlerExcute事件。在PreRequestHandlerExcute事件之后,HttpModule窗口就会将控制权暂时交给HttpHandler容器,以便进行真正的HTTP请求处理工作。

    而在HttpHandler容器内部会执行ProcessRequest方法来处理HTTP请求。在容器HttpHandler处理完毕整个HTTP请求之后,会将控制权交还给HttpModule,HttpModule则会继续对处理完毕的HTTP请求信息流进行层层的转交动作,直到返回到客户端为止。

    HttpModule过程在下面的事件:
    BeginRequest 指示请求处理开始。
    AuthenticateRequest PostAuthenticateRequest 封装请求身份验证过程。
    AuthorizeRequest PostAuthorizeRequest 封装请求授权过程。
    ResolveRequestCache PostResolveRequestCache 封装检查是否能利用以前缓存的输出页面处理请求的过程。
    PostMapRequestHandler 指示已发现用于处理请求的 HTTP 处理程序。
    AcquireRequestState PostAcquireRequestState 封装对请求会话状态的检索。
    PostRequestHandlerExecute 指示用于处理请求的 HTTP 处理程序已执行。
    ReleaseRequestState PostReleaseRequestState 封装对请求会话状态的发布。
    UpdateRequestCache PostUpdateRequestCache 封装检查是否应对请求的资源的输出进行缓存以备今后重复使用的过程。
    EndRequest 指示请求处理结束。

    可以利用HttpModule通过调用HttpApplication.CompleteRequest()方法实现当满足某一个条件时终止此次的HTTP请求。需要注意的是,即使调用了HttpApplication.CompleteRequest()方法终止了一个HTTP请求,ASP.NET Framework仍然会触发HttpApplication后面的这3个事件:EndRequest事件、PreSendRequestHeaders事件、PreSendRequestContent事件。
    如果存在多个自定义的HttpModule的话,当Module1终止了一个HTTP请求,这个HTTP请求将不会再触发Module2中相应的事件了,但Module2的最后三个事件仍会被触发。

    public class CompleteRequestHttpModule : IHttpModule
    {
    #region IHttpModule 成员
    public void Dispose()
    {}

    public void Init(HttpApplication application)
    {
    application.BeginRequest += new EventHandler(Application_BeginRequest);
    }

    void Application_BeginRequest(object sender, EventArgs e)
    {
    HttpApplication application = (HttpApplication)sender;
    application.CompleteRequest();
    application.Context.Response.Write("请求被终止。");
    }
    #endregion
    }

    HttpModule示例:

    过滤http请求

    /// <summary>
    /// 页面访问验证模块
    /// </summary>
    public class AuthenticationModule : IHttpModule
    {
    #region IHttpModule Members

    public void Dispose()
    {
    }

    public void Init(HttpApplication context)
    {
    context.AcquireRequestState += new EventHandler(context_AcquireRequestState);
    }

    #endregion

    private void context_AcquireRequestState(object sender, EventArgs e)
    {
    HttpContext context = HttpContext.Current;
    string path = context.Request.Path.ToLower();
    // 只处理aspx文件,因为其他文件无法获得Session对象,无法判断是否已经登录
    if (path.EndsWith(".aspx"))
    {
    // 如果用户没有登录就

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七广告
    零七广告
    零七广告
    零七广告