ASP.NET Lab

The Best Web, The Best Future

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

接口 IHttpHandlerFactory 负责创建并且管理用来处理请求的 HTTP 处理器。事实上这也是有可能的,因此,你可以创建一个实现了 IHttpHandlerFactory 接口的类,然后把这个类当成 HTTP 处理器来使用。这可以允许优秀的控件把 URL 映射到一个基于复杂的条件集来创建不同处理器的 HTTP 处理器工厂,从而能够越过 HTTP 请求的处理。例如,通过使用 HTTP 处理器工厂,你能够创建有限数量的 HTTP 处理器对象来访问昂贵的或者有限的资源(比如数据库连接),然后在将来的请求中重用这些处理器对象。

在下列范例中,一个 HTTP 处理器工厂就创建了用来识别 *.sample 资源的两个处理器,并且分别用于 HTTP GET 请求和 HTTP POST 请求。代码中首先出现的是一个在[实践:创建同步 HTTP 处理器]中被创建的处理器实例;然后就是一个在[实践:创建异步 HTTP 处理器]中被创建的处理器实例。

创建自定义 HTTP 处理器工厂

创建一个名为 HandlerFactory 的 HTTP 处理器工厂类
  1. 在你的 Web 站点的 App_Code 目录中创建一个名为 HelloWorldHandler 的类。
  2. 添加下列代码到你的类文件中。
    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 类
  1. 在你的 Web 站点的 App_Code 目录中创建一个名为 HelloWorldHandler 的类。
  2. 添加[实践:创建同步 HTTP 处理器]中的代码到这个类文件。
  3. 在你的 Web 站点的 App_Code 目录中创建一个名为 HelloWorldAsyncHandler 的类。
  4. 添加[实践:创建异步 HTTP 处理器]中的代码到这个类文件。

注册一个自定义的 HTTP 处理器工厂

在你创建完自定义 HTTP 处理器工厂类之后,你就必须把它注册到你的 Web 站点的 Web.config 文件中。这允许 ASP.NET 使用该处理器工厂类来为扩展名是 .sample 的资源请求而提供服务。

在 Web.config 文件中注册一个自定义的 HTTP 处理器
  1. 添加一个 Web.config 文件到你的 Web 站点中,如果该文件不存在的话。
  2. 添加下列元素到 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
  1. 打开 Internet Information Services(IIS)Manager。
  2. 右击你的应用程序名称,然后点击 Properties。

    提示:关于创建 ASP.NET 应用程序的指导,请参考:[实践:在 IIS 中创建并且配置本地 ASP.NET Web 站点]。

  3. 点击 Virtual Directory 标签,然后点击 Configuration。
  4. 在 Mappings 标签中点击 Add。

    Add/Edit Application Extension Mapping 对话框将会出现。

  5. 在 Executable 文本框中,输入或者浏览文件 Aspnet_isapi.dll。默认时,该文件位于下列位置。
    %windows%\Microsoft.NET\Framework\版本号\

    提示:你可以从其他映射那里得到完整的路径和文件名,比如 .aspx 文件的映射。

  6. 在 Extension 文本框中输入 .sample。
  7. 清除 Verify that file exists 复选框。
  8. 点击 OK 然后关闭 IIS Manager。

测试自定义的 HTTP 处理器工厂

在你创建并且注册了你的自定义 HTTP 处理器工厂之后,你就可以通过创建一个能够请求 .sample 资源的 HTML 页面来对它进行测试。

测试你的自定义 HTTP 处理器工厂
  1. 在你的应用程序中创建一个 HTML 页面(以 .htm 作为文件扩展名)。
  2. 在页面的 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>
  3. 在你的浏览器中请求这个 HTML 页面。
  4. 点击其中一个按钮。

    如果你点击的是第一个按钮,那么 HTTP 处理器工厂就会创建并且调用一个同步 HTTP 处理器来对请求产生回应。如果你点击的是第二个按钮,那么 HTTP 处理器工厂就会创建并且调用一个异步 HTTP 处理器来对请求产生回应。

posted on 2007-03-18 16:00  Laeb  阅读(392)  评论(0编辑  收藏  举报