在 ASP.NET 中使用 HTTP 模块实现 Intercepting Filter

原创 2007年09月17日 16:12:00
 
China

在 ASP.NET 中使用 HTTP 模块实现 Intercepting Filter

发布日期: 2004-4-1 | 更新日期: 2004-4-21

使用 Microsoft .NET 的企业解决方案模式 > 分布式系统模式 > 在 ASP.NET 中使用 HTTP 模块实现 Intercepting Filter

版本: 1.0.1

本页内容
上下文 上下文
实现策略 实现策略
示例 示例
测试考虑事项 测试考虑事项
结果上下文 结果上下文
相关模式 相关模式
致谢 致谢

上下文

您要在 Microsoft? ASP.NET 中利用许多不同类型的请求来构建 Web 应用程序。有些请求被转到适当的网页,而其他请求必须在处理之前以某种方式进行记录或修改。

实现策略

Intercepting Filter (截取筛选器)模式的 ASP.NET 实现是该模式中所描述的事件驱动型筛选器的一个例子。ASP.NET 提供了应用程序可以在请求处理期间钩挂的一系列事件。这些事件保证了请求的状态。各个筛选器都是通过一个 HTTP 模块实现的。HTTP 模块是一个实现 IHttpModule 接口并确定应该何时调用筛选器的类。ASP.NET 包括一组可由应用程序使用的 HTTP 模块。例如,SessionStateModule 由 ASP.NET 提供,以便向应用程序提供会话状态服务。您可以创建自己的自定义 HTTP 模块,以便根据应用程序的需要筛选请求或响应。

编写自定义 HTTP 模块的一般过程是:

实现 IHttpModule 接口。

处理 Init 方法并注册到您需要的事件。

处理事件。

如果必须清理,也可以选择实现 Dispose 方法。

在 web.config 文件中注册模块。

事件

下表显示了可以使用 ASP.NET 截取的、在处理请求期间产生的事件。所有事件都是按照发生的顺序列出的。

第一个列表显示了处理请求之前产生的事件。

BeginRequest. 此事件标志着这是一个新请求;每个请求都必须产生该事件。

AuthenticateRequest. 此事件标志着所配置的身份验证机制已经验证了请求。附加到此事件可向筛选器确保请求已通过身份验证。

AuthorizeRequest. 与 AuthenticateRequest 一样,此事件标志着现在请求在处理过程中又前进了一步,并且请求已经得到授权。

ResolveRequestCache. 输出缓存模块使用此事件来简化对已经缓存的请求所进行的处理。

AcquireRequestState. 此事件标志着应该获得各个请求状态。

PreRequestHandlerExecute. 此事件标志着请求处理程序将要执行。这是在调用此请求的 HTTP 处理程序之前您可以参与的最后一个事件。

下一个列表显示了处理请求之后产生的事件。这些事件是按照发生的顺序列出的:

PostRequestHandlerExecute. 此事件标志着 HTTP 处理程序已经完成了对请求的处理。

ReleaseRequestState. 此事件标志着应该存储请求状态,因为应用程序已经完成了对请求的处理。

UpdateRequestCache. 此事件标志着代码处理已完成,可以将文件添加到 ASP.NET 缓存中。

EndRequest. 此事件标志着已完成对请求的所有处理。这是应用程序结束时所调用的最后一个事件。

此外,以下三个请求处理前事件可以按不确定顺序引发:

PreSendRequestHeaders.此事件标志着 HTTP 头将要发送给客户端。因此可以在发送之前添加、删除或修改头信息。

PreSendRequestContent. 此事件标志着内容将要发送给客户端。这为发送之前修改内容提供了一个机会。

Error. 此事件标志着有未处理的异常。

下面的示例说明了请求在通过了 ASP.NET 运行库的身份验证之后是如何被截取的。对名为 UserLogger 的示例模块进行初始化时,它将把一个名为 OnAuthenticate 的成员函数连接到 AuthenticateRequest 事件。每次对新的请求进行身份验证时,都会调用 OnAuthenticate 函数。在本示例中,OnAuthenticate 函数将把通过了身份验证的用户的名称记录到 Intercepting Filter 模式应用程序事件日志中。

using System; 
using System.Web; 
using System.Security.Principal; 
using System.Diagnostics; 
public class UserLogModule : IHttpModule 
{ 
   private HttpApplication httpApp; 
   public void Init(HttpApplication httpApp) 
   { 
      this.httpApp = httpApp; 
      httpApp.AuthenticateRequest += new EventHandler(OnAuthentication); 
   } 
   void OnAuthentication(object sender, EventArgs a) 
   { 
      HttpApplication application = (HttpApplication)sender; 
      HttpResponse response = application.Context.Response; 
      WindowsIdentity identity =  
         (WindowsIdentity)application.Context.User.Identity; 
      LogUser(identity.Name); 
   } 
   private void LogUser(String name) 
   { 
      EventLog log = new EventLog(); 
      log.Source = "Intercepting Filter Pattern"; 
      log.WriteEntry(name,EventLogEntryType.Information); 
   } 
   public void Dispose() 
   {} 
} 

示例模块必须添加到 web.config 文件中,以便 ASP.NET 运行库能够识别该模块。下面是为 UserLogModule 示例模块进行了更改的配置文件:

<httpModules> 
      <add name="UserLogModule" type="UserLogModule, ifilter" /> 
</httpModules> 

示例

下面是内置在 Microsoft .NET 中的截取筛选器的示例:

DefaultAuthenticationModule. 此筛选器确保 Authentication 对象出现在 HttpContext 对象中。

FileAuthorizationModule. 此筛选器验证远程用户是否拥有访问所请求的文件时所需的 Microsoft Windows NT? 权限。

FormsAuthenticationModule. 此筛选器使 ASP.NET 应用程序能够使用窗体验证。

PassportAuthenticationModule.此筛选器提供了包装 PassportAuthentication 服务以便进行 Passport 身份验证的包装器。

SessionStateModule. 此筛选器为应用程序提供会话状态服务。

UrlAuthorizationModule. 此筛选器提供基于 URL 的授权服务,以便允许或拒绝对指定 URL 进行访问。

WindowsAuthenticationModule. 此筛选器使 ASP.NET 应用程序能够使用 Microsoft Windows? 或 Internet 信息服务 (IIS) 的身份验证机制。

测试考虑事项

如果没有 ASP.NET 运行库,就不可能测试 HTTP 模块。因此,必须采用稍微不同的实现策略,尽可能将更多的功能与实现 IHttpModule 接口的类分开。在前面的示例中,记录用户名的代码不需要 ASP.NET 运行库。此功能可以放在名为 UserLog 的类中,该类独立于 ASP.NET。实现 IHttpModule 接口的 UserLogAdapter 类可以使用 UserLog 类。这样,其他类就可以使用 UserLog 类,而且,您也可以在没有 ASP.NET 环境的情况下对它进行测试。以下是前面所描述的同一功能,但它允许在没有 ASP.NET 运行库的情况下对记录功能进行测试:

using System; 
using System.Diagnostics; 
public class UserLog 
{ 
   public static void Write(String name) 
   { 
      EventLog log = new EventLog(); 
      log.Source = "Intercepting Filter Pattern"; 
      log.WriteEntry(name,EventLogEntryType.Information); 
   } 
} 
using System; 
using System.Web; 
using System.Security.Principal; 
public class UserLogAdapter 
{ 
   private HttpApplication httpApp; 
   public void Init(HttpApplication httpApp) 
   { 
      this.httpApp = httpApp; 
      httpApp.AuthenticateRequest += new EventHandler(OnAuthentication); 
   } 
   void OnAuthentication(object sender, EventArgs a) 
   { 
      HttpApplication application = (HttpApplication)sender; 
      HttpResponse response = application.Context.Response; 
      WindowsIdentity identity =  
         (WindowsIdentity)application.Context.User.Identity; 
      UserLog.Write(identity.Name); 
   } 
   public void Dispose() 
   {} 
} 

结果上下文

Intercepting Filter 模式的实现具有下列优缺点:

优点

使用事件驱动的筛选器。ASP.NET 运行库提供了许多事件,这使程序员能够钩挂到适当的位置来添加功能。这是一个优点,因为程序员可以根据事件来假设请求的当前状态。例如,如果事件是 AuthenticateRequest,您可以假设在调用您的筛选器之前请求已通过了身份验证。

实现灵活的配置。通过编辑 web.config 文件可添加或删除模块。不必更改源代码,不必重新启动 ASP.NET 运行库。

降低了对顺序的依赖性Intercepting Filter 的一个缺点是,筛选器不应该与顺序相关。因为 ASP.NET 实现会使用事件,它通过使用事件来指示某个处理已经发生来缓解该问题。

缺点

如果不测试整个 ASP.NET 运行库,对实现了 IHttpModule 接口的类进行测试将很困难或不可能。

相关模式

有关详细信息,请参阅 Adapter [Gamma95]。在“测试考虑事项”中使用了 Adapter 模式,以帮助隔离核心功能,并提高可测试性。

致谢

[Gamma95] Gamma, Helm, Johnson, and Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1995.


©2007 Microsoft Corporation. 版权所有.   保留所有权利 | 商标 | 隐私权声明
 Microsoft
 

Asp.Net使用Easy UI DataGrid 实现行过滤[行模糊查询数据]

在使用Easy UI datagrid 列表控件时,对列表数据的查询需要自己写查询页面,然后点击按钮查询取到数据刷新datagrid,如何说直接在datagrid列表上面对列表上面的某一列进行数据查询...
  • shechaojin
  • shechaojin
  • 2016年05月25日 15:47
  • 2429

ASP.NET MVC 4 插件化架构简单实现-思路篇

用过和做过插件的都会了解插件的好处,园子里也有很多和讨论,但大都只些简单的加载程序集什么的,这里主要讨论的就是使用 ASP.NET MVC 4 来实现每个插件都可以完全从主站点剥离出来,即使只是一个插...
  • hao_ds
  • hao_ds
  • 2014年12月23日 15:06
  • 3994

tomcat责任链设计模式 FilterChain原理解析

今天晚上花了些时间debug了下tomcat,注意观察了下tomcat内部过滤器的实现,其实tomcat内部过滤器采用了责任链的设计模式, (其实struts2拦截器那一块采用了相似的设计模式),以...
  • jinhao505
  • jinhao505
  • 2014年09月05日 22:54
  • 4888

ASP.NET MVC使用Filter实现页面验证与授权

关于ASP.NET MVC的Filter(过滤器的讲解)见:http://www.cnblogs.com/BreatheLee/archive/2012/06/07/2540469.html 关于授...
  • zht666
  • zht666
  • 2013年01月21日 15:54
  • 12336

URL重写及ASP.NET路由、Http处理模块、程序等

这段时间在学习ASP.NET路由、HTTP处理等内容,了解了一些,但又未完全弄懂,似是而非,不管如何,作一总结,供日后借鉴和修改。一、IIS6和IIS7经典模式和集成模式在IIS6及IIS7经典模式下...
  • leftfist
  • leftfist
  • 2013年08月30日 19:39
  • 6660

AOP实践--ASP.NET MVC 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁

在开发程序的过程中,稍微不注意就会隐含有sql注入的危险。今天我就来说下,ASP.NET mvc 5使用Filter过滤Action参数防止sql注入,让你代码安全简洁。不用每下地方对参数的值都...
  • rise51
  • rise51
  • 2016年04月17日 08:39
  • 3456

Asp.net mvc自定义Filter简单使用

自定义Filter的基本思路是继承基类ActionFilterAttribute,并根据实际需要重写OnActionExecuting,OnActionExecuted,OnResultExecuti...
  • jiangfei009003
  • jiangfei009003
  • 2015年05月05日 17:08
  • 925

Sitemesh 3 的使用及配置 1 . Sitemesh 3 简介 Sitemesh 是一个网页布局和修饰的框架,基于 Servlet 中的 Filter,类似于 ASP.NET 中的‘母版页’

Sitemesh 3 的使用及配置 1 . Sitemesh 3 简介 Sitemesh 是一个网页布局和修饰的框架,基于 Servlet 中的 Filter,类似于 ASP....
  • qq_19674905
  • qq_19674905
  • 2017年06月23日 00:33
  • 327

ASP.NET MVC中Filter使用

Filter 接口 Filter类型 接口 MVC的默认实现 Description Authorization IAuthor...
  • itsoftchenfei
  • itsoftchenfei
  • 2013年08月24日 11:14
  • 3393

asp.net mvc 下使用 HttpResponse.Filter

HttpResponse 的 Filter 属性是一个流,可以利用它对 response 对象的输出进行修改。自定义过滤器时,如果从 Stream 派生新类,则必须要实现 Stream 的全部抽象方法...
  • theillusion
  • theillusion
  • 2011年04月10日 20:27
  • 346
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:在 ASP.NET 中使用 HTTP 模块实现 Intercepting Filter
举报原因:
原因补充:

(最多只允许输入30个字)