接口 IHttpHandlerFactory 负责创建并且管理用来处理请求的 HTTP 处理器。事实上这也是有可能的,因此,你可以创建一个实现了 IHttpHandlerFactory 接口的类,然后把这个类当成 HTTP 处理器来使用。这可以允许优秀的控件把 URL 映射到一个基于复杂的条件集来创建不同处理器的 HTTP 处理器工厂,从而能够越过 HTTP 请求的处理。例如,通过使用 HTTP 处理器工厂,你能够创建有限数量的 HTTP 处理器对象来访问昂贵的或者有限的资源(比如数据库连接),然后在将来的请求中重用这些处理器对象。
在下列范例中,一个 HTTP 处理器工厂就创建了用来识别 *.sample 资源的两个处理器,并且分别用于 HTTP GET 请求和 HTTP POST 请求。代码中首先出现的是一个在[实践:创建同步 HTTP 处理器]中被创建的处理器实例;然后就是一个在[实践:创建异步 HTTP 处理器]中被创建的处理器实例。
创建自定义 HTTP 处理器工厂
创建一个名为 HandlerFactory 的 HTTP 处理器工厂类
- 在你的 Web 站点的 App_Code 目录中创建一个名为 HelloWorldHandler 的类。
- 添加下列代码到你的类文件中。
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 类
- 在你的 Web 站点的 App_Code 目录中创建一个名为 HelloWorldHandler 的类。
- 添加[实践:创建同步 HTTP 处理器]中的代码到这个类文件。
- 在你的 Web 站点的 App_Code 目录中创建一个名为 HelloWorldAsyncHandler 的类。
- 添加[实践:创建异步 HTTP 处理器]中的代码到这个类文件。
注册一个自定义的 HTTP 处理器工厂
在你创建完自定义 HTTP 处理器工厂类之后,你就必须把它注册到你的 Web 站点的 Web.config 文件中。这允许 ASP.NET 使用该处理器工厂类来为扩展名是 .sample 的资源请求而提供服务。
在 Web.config 文件中注册一个自定义的 HTTP 处理器
- 添加一个 Web.config 文件到你的 Web 站点中,如果该文件不存在的话。
- 添加下列元素到 Web.config 文件中。
<configuration> <system.web> <httpHandlers> <add verb="GET,POST" path="*.sample" type="HandlerFactory" /> </httpHandlers> </system.web> </configuration>
该代码以类名称和 HandlerFactory 的处理器名称来注册处理器。
在 IIS 6.0 中配置 HTTP 处理器扩展
Internet Information Services(IIS)只会把特定文件类型的请求传递给 ASP.NET 的服务。默认时,拥有扩展名 .aspx,.ascx 和 .asmx 的文件已经在 IIS 6.0 中被映射到了 ASP.NET ISAPI 扩展(Aspnet_isapi.dll)。因此,如果你需要 ASP.NET 来处理自定义的 URL 扩展的话,那么你就必须在 IIS 中映射这些扩展名。关于更多信息,请参考:[ASP.NET 生命周期]。
在 IIS 6.0 中把文件扩展名 .sample 映射到 ASP.NET
- 打开 Internet Information Services(IIS)Manager。
- 右击你的应用程序名称,然后点击 Properties。
提示:关于创建 ASP.NET 应用程序的指导,请参考:[实践:在 IIS 中创建并且配置本地 ASP.NET Web 站点]。
- 点击 Virtual Directory 标签,然后点击 Configuration。
- 在 Mappings 标签中点击 Add。
Add/Edit Application Extension Mapping 对话框将会出现。
- 在 Executable 文本框中,输入或者浏览文件 Aspnet_isapi.dll。默认时,该文件位于下列位置。
%windows%\Microsoft.NET\Framework\版本号\
提示:你可以从其他映射那里得到完整的路径和文件名,比如 .aspx 文件的映射。
- 在 Extension 文本框中输入 .sample。
- 清除 Verify that file exists 复选框。
- 点击 OK 然后关闭 IIS Manager。
测试自定义的 HTTP 处理器工厂
在你创建并且注册了你的自定义 HTTP 处理器工厂之后,你就可以通过创建一个能够请求 .sample 资源的 HTML 页面来对它进行测试。
测试你的自定义 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 处理器来对请求产生回应。