现在的位置: 首页 > 综合 > 正文

MSDN文章:HttpModules

2013年09月03日 ⁄ 综合 ⁄ 共 3387字 ⁄ 字号 评论关闭

??????? ASP.NET中一个有用的特性是HTTP管道的扩展性,所谓HTTP管道指的是从客户端到服务器端所经过的路径。这个月我将给大家展示一下HTTP Modules(模块)。我们可以用HTTP Modules扩展ASP.NET应用程序---也就是为我们的应用程序添加预处理和善后处理,然后由新的应用程序来处理每个到达的请求。举例来说,如果你想为你的应用程序添加自定义的认证,最有用的技术就是截取到达的客户端的请求,然后在自定义的HTTP module,下面我们就以HTTP管道开始我们的介绍。


HTTP管道

????? 要搞懂ASPNET中的HTTP module,你需要清楚HTTP管道如何工作。当一个HTTP请求通过80端口(HTTP常用端口,HTTPS和验证的sockets端口常用443端口)到达服务器,而在真正由你的应用程序处理之前,该请求会通过组成HTTP管道的一系列的过程。
????? Microsoft® Internet Information Services (IIS)
是一系列环节当中的第一环。虽然ASPNET有自己的对象模型、进程隔离机制、基于.NET Framework类的会话状态管理机制,IIS仍然被用来把请求传递到ASPNET运行时。IISASPNET映射到ASPNET_ISAPI.DLL,它是一个由ASPNET提供的ISAPI扩展。ASPNET_ISAPI.DLL的功能是将请求传递到ASPNET工作者进程ASPNET_WP.EXE。这部分工作完成之后,该请求就被包装到HttpContext类的一个实例当中,接着通过管道经过许多ASPNET类。HttpContext 类包括很多成员,比如响应、请求,也包括你可能想知道的于请求有关的安全信息。
???????
接下来该请求被传送到一个HttpApplication实例。这个步骤对于获得应用程序范围内的方法、数据和事件是很有用处的。由于这个类(HttpApplication)对于设置HTTPmoduls是很关键的,我将深入的来介绍一下HttpApplication
?????? HttpApplication
对象接受到请求之后,将它传递过一个或几个HttpModule对象。有许多系统级别的HTTP模块提供从状态管理认证到输出缓存的服务。截取请求的模块的数量是由机器级别的machine.config和对应应用同程序的web.config文件来设定。在ASP中提供预处理和善后处理比较经典的做法是在ISAPI过滤器中完成。这就表明,ASP HTTP模块编写时更直接更简单。

?????? 这一系列环节中最后一个环节是HttpHandler。如果你用过一段时间的ASPNET,你应该对System.Web.UI.Page 类比较熟悉。Page类是HttpHander的一个实例,它实现了IHttpHandler接口。实现IHttpHandler接口的类可以通过这个接口的ProcessRequest方法勾入(HOOKHTTP管道和服务请求。


Figure 1 HTTP Request

每个请求到来时,如果发现请求的URI指向一个ASP.NET扩展名的文件,ASP.NET会在web.config文件当中寻找与这个扩展名相关的实现了IhttpHandler接口的类。如果你在你的web.config文件当中没有做任何改变,当浏览到一个ASPX文件时,ASP.NET就会根据System.Web.UI.Page创建一个处理程序。你可以通过设置web.config文件来将单独的HTTP处理程序映射到各自相应的URI。图1表示了一个HTTP请求通过HTTP管道时经过的过程。与HttpModule相关的类包括:BeginRequest, AuthenticateRequest, AuthorizeRequest等。ASP.NET HTTP Modules

一个HTTP module其实就是一个实现了System.Web.IhttpModule接口的类。

public interface IHttpModule

{

? void Dispose();

? void Init(HttpApplication context);

}

当一个HttpModule挂接到管道时(通过在web.config文件中的设定的入口),ASP.NET运行时调用此模块的InitDispose方法。当模块将自己附加到HttpApplication对象时调用Init方法,而当模块取消与HttpApplication 的联系时调用Dispose方法。InitDispose方法表示了模块挂接到HttpApplication所暴露的一系列事件。这些事件包括请求开始、请求结束、请求认证等等。注意一下传递给Init方法的HttpApplication类型的参数。一般来说,Init方法接管HttpApplication对象并将事件处理程序映射到相应的事件。

2自定义的HttpModule

// This module, named HttpModules.CS will be compiled
//? into an assembly named HttpModules.dll
using System;
using System.Web;
namespace HttpModuleExamples {
?? public class CustomHttpModule : IHttpModule {
????? // IHttpModule members
????? public void Init(HttpApplication httpApp) {
???????? httpApp.BeginRequest +=???
?????????? new EventHandler(this.OnBeginRequest);???
???????? httpApp.EndRequest +=
?????????? new EventHandler(this.OnEndRequest);
????? }
????? public void Dispose() {
???????? // Usually, nothing has to happen here...
????? }
????? // event handlers??
????? public void OnBeginRequest(object o, EventArgs ea) {
???????? HttpApplication httpApp = (HttpApplication) o;??
???????? HttpContext ctx = HttpContext.Current;
???????? ctx.Response.Write("Beginning Request
");
????? }
????? public void OnEndRequest(object o, EventArgs ea) {
???????? HttpApplication httpApp = (HttpApplication) o;??
???????? HttpContext ctx = HttpContext.Current;
???????? ctx.Response.Write("Ending Request
");
????? }
?? }
}

2给出了一些C#代码,这些代码定义了一个附加到一个应用程序的BeginRequestEndRequest事件的HttpModule,它为每个请求提供简单的预处理(请求处理之前)和善后处理(请求处理之后)。这些代码被编译到一个程序集并部署到bin文件夹。要想把这个处理程序安装到应用程序处理的一系列环节当中,我们只需象下面的一样在web.config文件当中的httpModule部分声明一下。

下面的代码展示的是一个在处理环节中使用了HttpModule的普通的ASPX文件:

ASP.NET现在开始通过CustomHttpModule的请求开始的OnBeginRequest方法和请求结束时的OnEndRequest方法来跟踪所有的请求。当你浏览到这个页面时你会看到像图3中的一个简单的ASPX页面。

3?一个简单的ASPX页面

HttpModule中你并不是仅仅可以截获BeginRequestEndRequest事件。图4给出了你可以跟踪的并且可以放到HttpModule处理的

抱歉!评论已关闭.