






















HTTP 模块就是在你的应用程序产生每个请求的时候而被调用的汇编集。HTTP 模块通过 ASP.NET 请求管道的一部分而被调用并且能够访问贯穿于请求的生命周期事件。HTTP 模块因此为你提供机会来检查输入请求并且获取基于该请求的动作。它们同样为你提供机会来检查并且更改输出回应。
ASP.NET HTTP 模块与 ISAPI 过滤器的相似之处是它们都是为所有的请求而运行。但是,它们被编写在被管理代码中并且完全被集成在 ASP.NET 应用程序的生命周期中。
HTTP 模块的典型用途包括:
ASP.NET 使用模块来实现不同的应用程序特征,包括窗体识别、高速缓存、会话状态,以及客户端脚本服务。在每种情况下,当这些服务被启用的时候,该模块就被作为请求的一部分而被调用并且完成任何单个页面请求范围之外的任务。模块能够消耗应用程序事件也能够引发可以在 Global.asax 文件中被处理的事件。关于应用程序事件的更多信息,请参考[ASP.NET 应用程序生命周期概览]。
提示:HTTP 模块不同于 HTTP 处理器。HTTP 模块为所有请求和回应而被调用,而 HTTP 处理器只运行在特定请求的回应中。关于更多信息,请参考[介绍 HTTP 处理器]。
你需要在应用程序的 Web.config 文件中注册自定义 HTTP 模块。当 ASP.NET 为 HttpApplication 类(用于呈现你的应用程序)创建实例的时候,也会创建任何已注册模块的实例,它的 Init 方法会被调用并且模块初始化它自身。关于更多信息,请参考[ASP.NET 应用程序生命周期概览]。
在模块的 Init 方法中,你可以把事件绑定到在模块中被创建的方法,从而订阅不同的应用程序事件(比如 BeginRequest 或者 EndRequest)。当这些事件被引发的时候,模块中的适当方法就被调用并且模块可以完成任何必需的逻辑,比如一个鉴别检查或者日志请求信息。在事件处理的期间,模块可以访问当前请求的 Context 属性。这允许你把请求重定向到一个可供选择的页面、更改请求,或者完成任何其他请求操作。例如,如果你的模块包括一个鉴别检查,模块可能会检查凭证并且重定向到一个登入页面或者出错页面,如果该凭证是错误的话。否则,当模块的事件处理器已经完成运行,ASP.NET 就会在管道中调用下一个进程,这有可能是另一个模块或者是关于该请求的适当的 HTTP 处理器(比如一个 .aspx 文件)。
你可以在应用程序的 Global.asax 文件中实现模块的多数功能,从而允许你对应用程序的事件产生回应。但是,模块对比于 Global.asax 文件的一个优势就是它们是被封装的并且只需要创建一次就可以在许多不同的应用程序中被使用。通过把它们添加到 Global Assembly Cache(GAC)并且在 Machine.config 文件中注册,你就可以对它们实现跨应用程序的重用。关于更多信息,请参考[全局汇编缓存]。
但是,使用 Global.asax 文件的优势就是你可以把代码存放到其他已注册的模块事件(比如 Session_Start 和 Session_End 方法)中。另外,Global.asax 文件还允许你例示可用于整个应用程序的全局对象。
只要你需要创建依赖于应用程序事件的代码、并且你想要在其他应用程序中重用模块,或者你不想要在 Global.asax 文件中存放复杂的代码,你就应该使用模块。你应该把代码存放进 Global.asax 文件,只要你需要创建依赖于应用程序事件的代码并且你不需要跨应用程序对它进行重用,或者当你需要订阅在模块中不可用的事件(比如 Session_Start)的时候。
你可以创建一个实现了 IHttpModule 接口的类然后把它注册到 Web.config 文件中,从而创建一个自定义 HTTP 模块。编写 HTTP 模块的一般过程是:
关于更多信息,请参考[实践:创建自定义 HTTP 模块]。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。