架构师_程序员

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1486|回复: 2
打印 上一主题 下一主题

[ASP.NET] asp.net IHttpModule接口详解

[复制链接]
跳转到指定楼层
楼主
发表于 2018-3-13 21:46:06 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
写在前面

关于IHttpModule的相关内容,在面试的时候也被问到过,当时也是隐隐约约的感觉这个接口有一个Init方法,可以在实现类中的Init方法注册一系列的事件,说句实话,具体哪些事件,忘了差不多了。今天周末在家,也确实没什么事,就算是对这块知识进行查漏补缺了。

IHttpModule工作方式

熟悉asp.net生命周期的朋友,应该知道HttpModule的执行是在HttpHandler之前被执行,执行HttpModule的一系列事件后然后执行HttpHandler,然后又执行HttpModule的一些事件。具体的可以参考下面的生命周期的图。



而HttpHandler才是处理http请求的地方,HttpModule是一个HTTP请求的“必经之路”,所以可以在这个HTTP请求传递到真正的请求处理中心(HttpHandler)之前附加一些需要的信息在这个HTTP请求信息之上,或者针对截获的这个HTTP请求信息作一些额外的工作,或者在某些情况下干脆终止满足一些条件的HTTP请求,从而可以起到一个Filter过滤器的作用。

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

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

一个实例

项目结构



MyHttpModule代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;

  5. namespace MyHttpModule
  6. {
  7.     /// <summary>
  8.     /// 自定义HttpModule
  9.     /// </summary>
  10.     public class MyHttpModule : IHttpModule
  11.     {
  12.         public void Dispose()
  13.         {
  14.             throw new NotImplementedException();
  15.         }

  16.         public void Init(HttpApplication context)
  17.         {
  18.             context.BeginRequest += context_BeginRequest;
  19.             context.EndRequest += context_EndRequest;
  20.         }

  21.         void context_EndRequest(object sender, EventArgs e)
  22.         {
  23.             HttpApplication app = sender as HttpApplication;
  24.             if (app != null)
  25.             {
  26.                 HttpContext context = app.Context;
  27.                 HttpResponse response = app.Response;
  28.                 response.Write("自定义HttpModule中的EndRequest");

  29.             }
  30.         }

  31.         void context_BeginRequest(object sender, EventArgs e)
  32.         {
  33.             HttpApplication app = sender as HttpApplication;
  34.             if (app != null)
  35.             {
  36.                 HttpContext context = app.Context;
  37.                 HttpResponse response = app.Response;
  38.                 response.Write("自定义HttpModule中的BeginRequest");

  39.             }
  40.         }
  41.     }
  42. }
复制代码
在web.config注册自定义的HttpModule

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!--
  3.   For more information on how to configure your ASP.NET application, please visit
  4.   http://go.microsoft.com/fwlink/?LinkId=169433
  5.   -->
  6. <configuration>
  7.   <system.web>
  8.     <compilation debug="true" targetFramework="4.5" />
  9.     <httpRuntime targetFramework="4.5" />
  10.    
  11.   </system.web>
  12.   <system.webServer>
  13.     <modules>
  14.       <add name="MyHttpModule" type="MyHttpModule.MyHttpModule,MyHttpModule"/>
  15.     </modules>
  16.   </system.webServer>
  17. </configuration>
复制代码
浏览页面Default.aspx



那么在生命周期过程中的一系列的事件的执行顺序是怎样的呢?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;

  5. namespace MyHttpModule
  6. {
  7.     /// <summary>
  8.     /// 自定义HttpModule
  9.     /// </summary>
  10.     public class MyHttpModule : IHttpModule
  11.     {
  12.         public void Dispose()
  13.         {
  14.             throw new NotImplementedException();
  15.         }

  16.         public void Init(HttpApplication context)
  17.         {
  18.             context.BeginRequest += context_BeginRequest;
  19.             context.EndRequest += context_EndRequest;
  20.             context.PostAcquireRequestState += context_PostAcquireRequestState;
  21.             context.PostAuthenticateRequest += context_PostAuthenticateRequest;
  22.             context.PostAuthorizeRequest += context_PostAuthorizeRequest;
  23.             context.PostLogRequest += context_PostLogRequest;
  24.             context.PostMapRequestHandler += context_PostMapRequestHandler;
  25.             context.PostRequestHandlerExecute += context_PostRequestHandlerExecute;
  26.             context.PostResolveRequestCache += context_PostResolveRequestCache;
  27.             context.PostUpdateRequestCache += context_PostUpdateRequestCache;
  28.             context.PreRequestHandlerExecute += context_PreRequestHandlerExecute;
  29.             context.PreSendRequestContent += context_PreSendRequestContent;
  30.             context.PreSendRequestHeaders += context_PreSendRequestHeaders;
  31.             context.RequestCompleted += context_RequestCompleted;
  32.             context.ResolveRequestCache += context_ResolveRequestCache;
  33.             context.UpdateRequestCache += context_UpdateRequestCache;
  34.             context.ReleaseRequestState += context_ReleaseRequestState;
  35.         }

  36.         void context_UpdateRequestCache(object sender, EventArgs e)
  37.         {
  38.             HttpApplication app = sender as HttpApplication;
  39.             if (app != null)
  40.             {
  41.                 HttpContext context = app.Context;
  42.                 HttpResponse response = app.Response;
  43.                 response.Write("自定义HttpModule中的UpdateRequestCache<br/>");
  44.             }
  45.         }

  46.         void context_ResolveRequestCache(object sender, EventArgs e)
  47.         {
  48.             HttpApplication app = sender as HttpApplication;
  49.             if (app != null)
  50.             {
  51.                 HttpContext context = app.Context;
  52.                 HttpResponse response = app.Response;
  53.                 response.Write("自定义HttpModule中的ResolveRequestCache<br/>");
  54.             }
  55.         }

  56.         void context_RequestCompleted(object sender, EventArgs e)
  57.         {
  58.             HttpApplication app = sender as HttpApplication;
  59.             if (app != null)
  60.             {
  61.                 HttpContext context = app.Context;
  62.                 HttpResponse response = app.Response;
  63.                 response.Write("自定义HttpModule中的RequestCompleted<br/>");
  64.             }
  65.         }

  66.         void context_PreSendRequestHeaders(object sender, EventArgs e)
  67.         {
  68.             HttpApplication app = sender as HttpApplication;
  69.             if (app != null)
  70.             {
  71.                 HttpContext context = app.Context;
  72.                 HttpResponse response = app.Response;
  73.                 response.Write("自定义HttpModule中的PreSendRequestHeaders<br/>");
  74.             }
  75.         }

  76.         void context_PreSendRequestContent(object sender, EventArgs e)
  77.         {
  78.             HttpApplication app = sender as HttpApplication;
  79.             if (app != null)
  80.             {
  81.                 HttpContext context = app.Context;
  82.                 HttpResponse response = app.Response;
  83.                 response.Write("自定义HttpModule中的PreSendRequestContent<br/>");
  84.             }
  85.         }

  86.         void context_PreRequestHandlerExecute(object sender, EventArgs e)
  87.         {
  88.             HttpApplication app = sender as HttpApplication;
  89.             if (app != null)
  90.             {
  91.                 HttpContext context = app.Context;
  92.                 HttpResponse response = app.Response;
  93.                 response.Write("自定义HttpModule中的PreRequestHandlerExecute<br/>");
  94.             }
  95.         }

  96.         void context_PostUpdateRequestCache(object sender, EventArgs e)
  97.         {
  98.             HttpApplication app = sender as HttpApplication;
  99.             if (app != null)
  100.             {
  101.                 HttpContext context = app.Context;
  102.                 HttpResponse response = app.Response;
  103.                 response.Write("自定义HttpModule中的PostUpdateRequestCache<br/>");
  104.             }
  105.         }

  106.         void context_PostResolveRequestCache(object sender, EventArgs e)
  107.         {
  108.             HttpApplication app = sender as HttpApplication;
  109.             if (app != null)
  110.             {
  111.                 HttpContext context = app.Context;
  112.                 HttpResponse response = app.Response;
  113.                 response.Write("自定义HttpModule中的PostResolveRequestCache<br/>");
  114.             }
  115.         }

  116.         void context_PostRequestHandlerExecute(object sender, EventArgs e)
  117.         {
  118.             HttpApplication app = sender as HttpApplication;
  119.             if (app != null)
  120.             {
  121.                 HttpContext context = app.Context;
  122.                 HttpResponse response = app.Response;
  123.                 response.Write("自定义HttpModule中的PostRequestHandlerExecut<br/>");
  124.             }
  125.         }

  126.         void context_PostMapRequestHandler(object sender, EventArgs e)
  127.         {
  128.             HttpApplication app = sender as HttpApplication;
  129.             if (app != null)
  130.             {
  131.                 HttpContext context = app.Context;
  132.                 HttpResponse response = app.Response;
  133.                 response.Write("自定义HttpModule中的PostMapRequestHandler<br/>");
  134.             }
  135.         }

  136.         void context_PostLogRequest(object sender, EventArgs e)
  137.         {
  138.               HttpApplication app = sender as HttpApplication;
  139.             if (app != null)
  140.             {
  141.                 HttpContext context = app.Context;
  142.                 HttpResponse response = app.Response;
  143.                 response.Write("自定义HttpModule中的PostLogRequest<br/>");
  144.             }
  145.         }

  146.         void context_PostAuthorizeRequest(object sender, EventArgs e)
  147.         {
  148.             HttpApplication app = sender as HttpApplication;
  149.             if (app != null)
  150.             {
  151.                 HttpContext context = app.Context;
  152.                 HttpResponse response = app.Response;
  153.                 response.Write("自定义HttpModule中的PostAuthorizeRequest<br/>");
  154.             }
  155.         }

  156.         void context_PostAuthenticateRequest(object sender, EventArgs e)
  157.         {
  158.             HttpApplication app = sender as HttpApplication;
  159.             if (app != null)
  160.             {
  161.                 HttpContext context = app.Context;
  162.                 HttpResponse response = app.Response;
  163.                 response.Write("自定义HttpModule中的PostAuthenticateRequest<br/>");
  164.             }
  165.         }

  166.         void context_PostAcquireRequestState(object sender, EventArgs e)
  167.         {
  168.             HttpApplication app = sender as HttpApplication;
  169.             if (app != null)
  170.             {
  171.                 HttpContext context = app.Context;
  172.                 HttpResponse response = app.Response;
  173.                 response.Write("自定义HttpModule中的PostAcquireRequestState<br/>");
  174.             }
  175.         }

  176.         void context_ReleaseRequestState(object sender, EventArgs e)
  177.         {
  178.             HttpApplication app = sender as HttpApplication;
  179.             if (app != null)
  180.             {
  181.                 HttpContext context = app.Context;
  182.                 HttpResponse response = app.Response;
  183.                 response.Write("自定义HttpModule中的ReleaseRequestState<br/>");
  184.             }
  185.         }

  186.         void context_EndRequest(object sender, EventArgs e)
  187.         {
  188.             HttpApplication app = sender as HttpApplication;
  189.             if (app != null)
  190.             {
  191.                 HttpContext context = app.Context;
  192.                 HttpResponse response = app.Response;
  193.                 response.Write("自定义HttpModule中的EndRequest<br/>");
  194.             }
  195.         }

  196.         void context_BeginRequest(object sender, EventArgs e)
  197.         {
  198.             HttpApplication app = sender as HttpApplication;
  199.             if (app != null)
  200.             {
  201.                 HttpContext context = app.Context;
  202.                 HttpResponse response = app.Response;
  203.                 response.Write("自定义HttpModule中的BeginRequest<br/>");

  204.             }
  205.         }
  206.     }
  207. }
复制代码

浏览结果



使用HttpModule终止此次Http请求

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Web;
  7. namespace MyHttpModule
  8. {
  9.     public class EndModule : IHttpModule
  10.     {
  11.         public void Dispose()
  12.         {
  13.             throw new NotImplementedException();
  14.         }

  15.         public void Init(HttpApplication context)
  16.         {
  17.             context.BeginRequest += context_BeginRequest;
  18.         }

  19.         void context_BeginRequest(object sender, EventArgs e)
  20.         {
  21.             HttpApplication application = (HttpApplication)sender;

  22.             application.CompleteRequest();

  23.             application.Context.Response.Write("请求被终止。");

  24.         }
  25.     }
  26. }
复制代码

结果



总结

这里介绍了在asp.net生命周期中一个最重要的接口IHttpModule,可以这样来形容该接口,事件接口,因为在实现类中的Init方法中,可以注册生命周期中的各种事件,并可以在事件中定义各种逻辑。





上一篇:Asp.Net IHttpHandler介绍
下一篇:c#必须使用适当的属性或方法修改此标头解决办法
帖子永久地址: 

架构师_程序员 - 论坛版权1、本主题所有言论和图片纯属会员个人意见,与本论坛立场无关
2、本站所有主题由该帖子作者发表,该帖子作者与架构师_程序员享有帖子相关版权
3、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和架构师_程序员的同意
4、帖子作者须承担一切因本文发表而直接或间接导致的民事或刑事法律责任
5、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责
6、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除并致以最深的歉意
7、架构师_程序员管理员和版主有权不事先通知发贴者而删除本文

码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
沙发
 楼主| 发表于 2018-3-13 21:46:47 | 只看该作者
 .NETFramework4.5提供了25个标准事件。
  1. //
  2.         // 摘要:
  3.         //     当 ASP.NET 获取与当前请求关联的当前状态(如会话状态)时发生。
  4.         public event EventHandler AcquireRequestState;
  5.         //
  6.         // 摘要:
  7.         //     当安全模块已建立用户标识时发生。
  8.         public event EventHandler AuthenticateRequest;
  9.         //
  10.         // 摘要:
  11.         //     当安全模块已验证用户授权时发生。
  12.         public event EventHandler AuthorizeRequest;
  13.         //
  14.         // 摘要:
  15.         //     在 ASP.NET 响应请求时作为 HTTP 执行管线链中的第一个事件发生。
  16.         public event EventHandler BeginRequest;
  17.         //
  18.         // 摘要:
  19.         //     在释放应用程序时发生。
  20.         public event EventHandler Disposed;
  21.         //
  22.         // 摘要:
  23.         //     在 ASP.NET 响应请求时作为 HTTP 执行管线链中的最后一个事件发生。
  24.         public event EventHandler EndRequest;
  25.         //
  26.         // 摘要:
  27.         //     当引发未经处理的异常时发生。
  28.         public event EventHandler Error;
  29.         //
  30.         // 摘要:
  31.         //     恰好在 ASP.NET 为当前请求执行任何记录之前发生。
  32.         public event EventHandler LogRequest;
  33.         //
  34.         // 摘要:
  35.         //     在选择了用来响应请求的处理程序时发生。
  36.         public event EventHandler MapRequestHandler;
  37.         //
  38.         // 摘要:
  39.         //     在已获得与当前请求关联的请求状态(例如会话状态)时发生。
  40.         public event EventHandler PostAcquireRequestState;
  41.         //
  42.         // 摘要:
  43.         //     当安全模块已建立用户标识时发生。
  44.         public event EventHandler PostAuthenticateRequest;
  45.         //
  46.         // 摘要:
  47.         //     在当前请求的用户已获授权时发生。
  48.         public event EventHandler PostAuthorizeRequest;
  49.         //
  50.         // 摘要:
  51.         //     在 ASP.NET 处理完 System.Web.HttpApplication.LogRequest 事件的所有事件处理程序后发生。
  52.         public event EventHandler PostLogRequest;
  53.         //
  54.         // 摘要:
  55.         //     在 ASP.NET 已将当前请求映射到相应的事件处理程序时发生。
  56.         public event EventHandler PostMapRequestHandler;
  57.         //
  58.         // 摘要:
  59.         //     在 ASP.NET 已完成所有请求事件处理程序的执行并且请求状态数据已存储时发生。
  60.         public event EventHandler PostReleaseRequestState;
  61.         //
  62.         // 摘要:
  63.         //     在 ASP.NET 事件处理程序(例如,某页或某个 XML Web service)执行完毕时发生。
  64.         public event EventHandler PostRequestHandlerExecute;
  65.         //
  66.         // 摘要:
  67.         //     在 ASP.NET 跳过当前事件处理程序的执行并允许缓存模块满足来自缓存的请求时发生。
  68.         public event EventHandler PostResolveRequestCache;
  69.         //
  70.         // 摘要:
  71.         //     在 ASP.NET 完成缓存模块的更新并存储了用于从缓存中为后续请求提供服务的响应后,发生此事件。
  72.         public event EventHandler PostUpdateRequestCache;
  73.         //
  74.         // 摘要:
  75.         //     恰好在 ASP.NET 开始执行事件处理程序(例如,某页或某个 XML Web services)前发生。
  76.         public event EventHandler PreRequestHandlerExecute;
  77.         //
  78.         // 摘要:
  79.         //     恰好在 ASP.NET 向客户端发送内容之前发生。
  80.         public event EventHandler PreSendRequestContent;
  81.         //
  82.         // 摘要:
  83.         //     恰好在 ASP.NET 向客户端发送 HTTP 标头之前发生。
  84.         public event EventHandler PreSendRequestHeaders;
  85.         //
  86.         // 摘要:
  87.         //     在 ASP.NET 执行完所有请求事件处理程序后发生。该事件将使状态模块保存当前状态数据。
  88.         public event EventHandler ReleaseRequestState;
  89.         //
  90.         // 摘要:
  91.         //     发生,在与该请求已释放的托管对象。
  92.         public event EventHandler RequestCompleted;
  93.         //
  94.         // 摘要:
  95.         //     在 ASP.NET 完成授权事件以使缓存模块从缓存中为请求提供服务后发生,从而绕过事件处理程序(例如某个页或 XML Web services)的执行。
  96.         public event EventHandler ResolveRequestCache;
  97.         //
  98.         // 摘要:
  99.         //     当 ASP.NET 执行完事件处理程序以使缓存模块存储将用于从缓存为后续请求提供服务的响应时发生。
  100.         public event EventHandler UpdateRequestCache;
复制代码


码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
板凳
 楼主| 发表于 2018-3-13 21:47:03 | 只看该作者
.NETFramework 4.0,提供了19个标准事件。

1.BeginRequest:asp.net开始处理请求的第一个事件,表示处理的开始。

2.AuthenticateRequest:验证请求,一般用来取得请求的用户信息。

3.PostAuthenticateRequest:已经获取请求的用户信息。

4.AuthorizeRequest:授权,一般用来检查用户的请求是否获得权限。

5.PostAuthorizeRequest:用户请求已经获得授权。

6.ResolveRequestCache:获取以前处理缓存的处理结果,如果以前缓存过,那么,不用再进行请求的处理工作,直接返回缓存的结果。

7.PostResolveRequestCache:已经完成缓存的处理工作。

8.PostMapRequestHandler:已经根据用户的请求,创建了请求的处理器对象。

9.AcquireRequestState:取得请求的状态,一般用于session

10.PostAcquireRequestState:已经获得了session

11.PreRequestHandlerExecute:准备执行处理程序。

12.PostRequestHandlerExecute:已经执行了处理程序

13.ReleaseRequestState:释放请求的状态。

14.PostReleaseRequestState:已经释放了请求的状态。

15.UpdateRequestCache:更新缓存。

16.PostUpdateRequestCache:已经更新了缓存。

17.LogRequest:请求的日志操作

18.PostLogRequest:已经完成请求的日志操作。

19.EndRequest:本次请求处理完成。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。

Mail To:help@itsvse.com

QQ|Archiver|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2018-12-12 07:00

Powered by Discuz! X3.4

© 2001-2014 Comsenz Inc.

快速回复 返回顶部 返回列表