ASP.NET Lab

The Best Web, The Best Future

博客园 首页 新随笔 订阅 管理

HTTP 模块就是在你的应用程序产生每个请求的时候而被调用的汇编集。HTTP 模块通过 ASP.NET 请求管道的一部分而被调用并且能够访问贯穿于请求的生命周期事件。HTTP 模块因此为你提供机会来检查输入请求并且获取基于该请求的动作。它们同样为你提供机会来检查并且更改输出回应。

ASP.NET HTTP 模块与 ISAPI 过滤器的相似之处是它们都是为所有的请求而运行。但是,它们被编写在被管理代码中并且完全被集成在 ASP.NET 应用程序的生命周期中。

HTTP 模块的典型用途包括:

  • 安全。因为你可以检查输入请求,你的 HTTP 模块能够在页面或者 XML Web 服务被请求之前,或者处理器被调用之前完成自定义识别或者其他安全检查。
  • 统计与日志。因为 HTTP 模块在每个请求中都被调用,你可以把请求统计和日志信息收集到一个集中的模块中,胜于在单独的页面中。
  • 自定义页头或者页脚。因为你可以更改输出回应,你可以把内容(比如自定义页头信息)注入进每个页面回应或者 XML Web 服务回应。

ASP.NET 使用模块来实现不同的应用程序特征,包括窗体识别、高速缓存、会话状态,以及客户端脚本服务。在每种情况下,当这些服务被启用的时候,该模块就被作为请求的一部分而被调用并且完成任何单个页面请求范围之外的任务。模块能够消耗应用程序事件也能够引发可以在 Global.asax 文件中被处理的事件。关于应用程序事件的更多信息,请参考[ASP.NET 应用程序生命周期概览]。

提示:HTTP 模块不同于 HTTP 处理器。HTTP 模块为所有请求和回应而被调用,而 HTTP 处理器只运行在特定请求的回应中。关于更多信息,请参考[介绍 HTTP 处理器]。

HTTP 模块如何工作

你需要在应用程序的 Web.config 文件中注册自定义 HTTP 模块。当 ASP.NET 为 HttpApplication 类(用于呈现你的应用程序)创建实例的时候,也会创建任何已注册模块的实例,它的 Init 方法会被调用并且模块初始化它自身。关于更多信息,请参考[ASP.NET 应用程序生命周期概览]。

在模块的 Init 方法中,你可以把事件绑定到在模块中被创建的方法,从而订阅不同的应用程序事件(比如 BeginRequest 或者 EndRequest)。当这些事件被引发的时候,模块中的适当方法就被调用并且模块可以完成任何必需的逻辑,比如一个鉴别检查或者日志请求信息。在事件处理的期间,模块可以访问当前请求的 Context 属性。这允许你把请求重定向到一个可供选择的页面、更改请求,或者完成任何其他请求操作。例如,如果你的模块包括一个鉴别检查,模块可能会检查凭证并且重定向到一个登入页面或者出错页面,如果该凭证是错误的话。否则,当模块的事件处理器已经完成运行,ASP.NET 就会在管道中调用下一个进程,这有可能是另一个模块或者是关于该请求的适当的 HTTP 处理器(比如一个 .aspx 文件)。

HTTP 模块 VS Global.asax 文件

你可以在应用程序的 Global.asax 文件中实现模块的多数功能,从而允许你对应用程序的事件产生回应。但是,模块对比于 Global.asax 文件的一个优势就是它们是被封装的并且只需要创建一次就可以在许多不同的应用程序中被使用。通过把它们添加到 Global Assembly Cache(GAC)并且在 Machine.config 文件中注册,你就可以对它们实现跨应用程序的重用。关于更多信息,请参考[全局汇编缓存]。

但是,使用 Global.asax 文件的优势就是你可以把代码存放到其他已注册的模块事件(比如 Session_Start 和 Session_End 方法)中。另外,Global.asax 文件还允许你例示可用于整个应用程序的全局对象。

只要你需要创建依赖于应用程序事件的代码、并且你想要在其他应用程序中重用模块,或者你不想要在 Global.asax 文件中存放复杂的代码,你就应该使用模块。你应该把代码存放进 Global.asax 文件,只要你需要创建依赖于应用程序事件的代码并且你不需要跨应用程序对它进行重用,或者当你需要订阅在模块中不可用的事件(比如 Session_Start)的时候。

创建 HTTP 模块

你可以创建一个实现了 IHttpModule 接口的类然后把它注册到 Web.config 文件中,从而创建一个自定义 HTTP 模块。编写 HTTP 模块的一般过程是:

  • 创建一个实现了 IHttpModule 的 frlrfSystemWebIHttpModuleClassTopic 接口。
  • 为 InitfrlrfSystemWebIHttpModuleClassInitTopic 方法编写一个处理器。你的 init 方法应该初始化你的模块并且订阅到任何必需的应用程序事件。例如,你可能订阅到 EndRequest 事件,如果你想要在回应中添加什么的话,或者你可能订阅到 AuthenticateRequest 事件,如果你想要完成自定义鉴别逻辑的话。关于应用程序事件的更多信息,请参考[ASP.NET 应用程序生命周期概览]。
  • 为你需要订阅的事件而编写代码。
  • 有选择地实现 Dispose 方法,如果你的模块需要清理的话。
  • 在 Web.config 文件中注册模块。

关于更多信息,请参考[实践:创建自定义 HTTP 模块]。

posted on 2007-03-19 17:38  Laeb  阅读(796)  评论(0编辑  收藏  举报