演练:创建和注册 HTTP 处理程序工厂
更新:2007 年 11 月
IHttpHandlerFactory 接口用于创建和管理处理请求的 HTTP 处理程序。因此,可以创建一个实现 IHttpHandlerFactory 接口的类,然后将该类用作 HTTP 处理程序。
通过这种方式创建处理程序可以使您更好地控制对 HTTP 请求的处理。使用这种方式可以将 URL 映射到基于一组条件创建不同处理程序的 HTTP 处理程序工厂。例如,通过使用 HTTP 处理程序工厂,可以创建有限数量的 HTTP 处理程序对象,来访问诸如数据库连接等昂贵或有限的资源。然后,可以在以后的请求中重用这些处理程序对象。
在本演练中,将创建一个 HTTP 处理程序工厂,该处理程序工厂为以扩展名 .sample 标识的资源创建两个处理程序。一个处理程序在 HTTP GET 请求期间处理资源,另一个处理程序处理 HTTP POST 请求。第一个处理程序是在演练:创建同步 HTTP 处理程序中介绍的处理程序的实例。第二个处理程序是在如何:创建异步 HTTP 处理程序中介绍的处理程序的实例。
本演练涉及以下任务:
如何创建 HTTP 处理程序工厂类的代码。
如何在 Web.config 文件中注册处理程序工厂并将 .sample 文件扩展名映射到该处理程序工厂。
如何在 Internet 信息服务 (IIS) 中将 .sample 文件扩展名映射到 ASP.NET。
前提条件
若要完成本演练,您需要:
Visual Studio 或 Visual Web Developer。
可以使用 IIS 运行的 ASP.NET 网站。
IIS 6.0 或 IIS 7.0。
创建自定义 HTTP 处理程序工厂
首先,创建一个处理程序工厂类。
创建 HTTP 处理程序工厂类
如果 ASP.NET 网站还没有 App_Code 文件夹,请在该站点的根目录下创建一个这样的文件夹。
在 App_Code 目录中,创建一个名为 HelloWorldHandler 的类。
将下面的代码添加到类文件中。
Imports System Imports System.Web Class HandlerFactory Implements IHttpHandlerFactory Public Function GetHandler(ByVal context As HttpContext, _ ByVal requestType As String, ByVal url As [String],_ ByVal pathTranslated As [String]) As IHttpHandler _ Implements IHttpHandlerFactory.GetHandler Dim handlerToReturn As IHttpHandler Dim requestType as String = _ context.Request.RequestType.ToLower() If "get" = requestType Then handlerToReturn = New HelloWorldHandler() Else If "post" = requestType Then handlerToReturn = New HelloWorldAsyncHandler() Else handlerToReturn = Nothing End If End If Return handlerToReturn End Function Public Sub ReleaseHandler(ByVal handler As IHttpHandler) _ Implements IHttpHandlerFactory.ReleaseHandler End Sub Public ReadOnly Property IsReusable() As Boolean Get Return False End Get End Property End Class
using System; using System.Web; class HandlerFactory : IHttpHandlerFactory { public IHttpHandler GetHandler(HttpContext context, string requestType, String url, String pathTranslated) { IHttpHandler handlerToReturn; if ("get" == context.Request.RequestType.ToLower()) { handlerToReturn = new HelloWorldHandler(); } else if ("post" == context.Request.RequestType.ToLower()) { handlerToReturn = new HelloWorldAsyncHandler(); } else { handlerToReturn = null; } return handlerToReturn; } public void ReleaseHandler(IHttpHandler handler) { } public bool IsReusable { get { return false; } } }
这段代码实现 IHttpHandlerFactory 接口的 GetHandler 方法。如果请求为 GET 请求,则该方法返回同步处理程序接口。如果请求为 POST 请求,则返回异步处理程序接口。
创建自定义 HTTP 处理程序
自定义 HTTP 处理程序工厂返回在演练:创建同步 HTTP 处理程序中介绍的同步处理程序,或者返回在如何:创建异步 HTTP 处理程序中介绍的异步处理程序。必须既创建同步 HelloWorldHandler 类又创建异步 HelloWorldAsyncHandler 类,自定义 HTTP 处理程序工厂才能返回这些处理程序。
创建 HelloWorldHandler 和 HelloWorldAsyncHandler 类
在网站的 App_Code 目录中,创建一个名为 HelloWorldHandler 的类。
将 演练:创建同步 HTTP 处理程序 中的代码添加到类文件中。
在网站的 App_Code 目录中,创建一个名为 HelloWorldAsyncHandler 的类。
将 如何:创建异步 HTTP 处理程序 中的代码添加到类文件中。
在 IIS 6.0 中注册自定义 HTTP 处理程序工厂
创建完自定义 HTTP 处理程序工厂类后,必须在应用程序的 Web.config 文件中注册该类。这使 ASP.NET 可以使用该处理程序工厂类处理向文件扩展名为 .sample 的资源发出的请求。
注册处理程序的过程会有所不同,取决于使用的是 IIS 6.0 还是 IIS 7.0。本节介绍如何在 IIS 6.0 中注册处理程序。下一节介绍如何在 IIS 7.0 中注册处理程序。
在 IIS 6.0 中注册处理程序工厂
如果网站还没有 Web.config 文件,请在该站点的根目录下创建一个这样的文件。
将下面突出显示的元素添加到 Web.config 文件中。
<configuration> <system.web> <httpHandlers> <add verb="GET,POST" path="*.sample" type="HandlerFactory" /> </httpHandlers> </system.web> </configuration>
这段代码使用 HandlerFactory 的类名和处理程序名称注册该处理程序工厂。
使用 IIS 管理器为 .sample 文件扩展名注册一个应用程序扩展名映射。有关更多信息,请参见如何:在 IIS 中配置 HTTP 处理程序扩展名。
在 IIS 7.0 中注册自定义 HTTP 处理程序工厂
在 IIS 7.0 中,应用程序可以在经典模式或集成模式下运行。在经典模式下,请求的处理方式与在 IIS 6.0 中大致相同。在集成模式下,IIS 7.0 使用管道(管道使其可以与 ASP.NET 共享请求、模块和其他功能)来管理请求。
对于 IIS 7.0,可以在 Web.config 文件或 IIS 管理器中注册处理程序工厂。因为在 IIS 7.0 中进行集中管理,所以应用程序的 Web.config 文件中的更改会在该应用程序的 IIS 管理器接口中反映出来,反之亦然。在后面的过程中,处理程序是在 Web.config 文件中注册的。
在运行于经典模式下的 IIS 7.0 中注册处理程序工厂
如果网站还没有 Web.config 文件,请创建这样一个文件。
将下面突出显示的元素添加到 Web.config 文件中。
说明: 为 aspnet_isapi.dll 文件替换正确的路径。该 .dll 文件位于安装 .NET Framework 的文件夹中。默认情况下,此文件夹为 C:\WINDOWS\Microsoft.NET\Framework\版本。
<configuration> <system.webServer> <handlers> <add verb="GET,POST" path="*.sample" name="HandlerFactory" type="HandlerFactory" modules="IsapiModule"/> scriptProcessor="%path%\aspnet_isapi.dll" </handlers> </system.webServer> </configuration>
配置元素通过类名注册自定义处理程序工厂,并将 .sample 文件扩展名映射到该处理程序。
说明: 由于要注册自定义文件扩展名,因此在 handlers 节和 httpHandlers 节中都要注册该处理程序。为了向后兼容,在经典模式下要使用 modules 属性将该处理程序指定为 ISAPI 模块。使用 scriptProcessor 属性指定 ASP.NET ISAPI dll 的路径。name 属性在 handlers 节中是必需的。
在运行于集成模式下的 IIS 7.0 中注册处理程序工厂
如果网站还没有 Web.config 文件,请在该站点的根目录下创建一个这样的文件。
将下面突出显示的元素添加到 Web.config 文件中。
<configuration> <system.webServer> <handlers> <add verb="GET,POST" path="*.sample" name="HandlerFactory" type="HandlerFactory"/> </handlers> </system.webServer> </configuration>
配置元素通过类名注册自定义处理程序工厂,并将 .sample 文件扩展名映射到该处理程序。
说明: 在 handlers 节中进行注册,但不在 httpHandlers 节中进行。需要 name 属性。
测试自定义 HTTP 处理程序工厂
创建并注册自定义 HTTP 处理程序工厂后,可以对它进行测试。
测试自定义 HTTP 处理程序工厂
在应用程序中创建一个 HTML 页(文件扩展名为 .htm)。
在该页的 body 节中,添加下面的标记。
<form action="Sample.sample" method="get"> <input type="submit" value="Submit to Sample.sample via Get" /> </form> <br /> <form action="Sample.sample" method="post"> <input type="submit" value="Submit to Sample.sample via Post" /> </form>
在浏览器中请求该 HTML 页。
单击其中的一个按钮。
在单击第一个按钮时,HTTP 处理程序工厂通过创建和调用同步 HTTP 处理程序来响应请求。在单击第二个按钮时,HTTP 处理程序工厂通过创建和调用异步 HTTP 处理程序来响应请求。
请参见
任务
概念
IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述