惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
人人都是产品经理
人人都是产品经理
S
Securelist
P
Proofpoint News Feed
H
Help Net Security
S
Schneier on Security
T
Tenable Blog
C
Cisco Blogs
S
Security @ Cisco Blogs
博客园 - 司徒正美
博客园 - 叶小钗
Cisco Talos Blog
Cisco Talos Blog
Google DeepMind News
Google DeepMind News
C
Cybersecurity and Infrastructure Security Agency CISA
Google Online Security Blog
Google Online Security Blog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Hacker News: Ask HN
Hacker News: Ask HN
NISL@THU
NISL@THU
云风的 BLOG
云风的 BLOG
V
Vulnerabilities – Threatpost
T
The Blog of Author Tim Ferriss
aimingoo的专栏
aimingoo的专栏
W
WeLiveSecurity
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Jina AI
Jina AI
腾讯CDC
WordPress大学
WordPress大学
Simon Willison's Weblog
Simon Willison's Weblog
Vercel News
Vercel News
小众软件
小众软件
N
Netflix TechBlog - Medium
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
雷峰网
雷峰网
Forbes - Security
Forbes - Security
The Hacker News
The Hacker News
博客园 - 聂微东
F
Full Disclosure
量子位
Scott Helme
Scott Helme
宝玉的分享
宝玉的分享
A
About on SuperTechFans
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Schneier on Security
Schneier on Security
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
K
Kaspersky official blog
AI
AI
SecWiki News
SecWiki News
Webroot Blog
Webroot Blog
Martin Fowler
Martin Fowler

博客园 - Laeb

ASP.NET Web 页面语法概览 ASP.NET Web 页面中的新事物 渐增的许可 介绍 ASP.NET Web 页面 管理工具 ASP.NET Web 页面概览 检测何时需要更改安全策略 安全策略管理的概览 System.Net 类的最佳习惯 异常处理的最佳习惯 面向世界应用程序开发的最佳习惯 使用 ASP.NET 所创建的 XML Web 服务的设计指南 为并发执行而创建应用程序与组件的指南 ASP.NET 控件与可访问 ASP.NET 中的可访问支持 实践:创建自定义 HTTP 模块 HTTP 模块介绍 实践:注册 HTTP 处理器 实践:创建同步 HTTP 处理器
实践:创建 HTTP 处理器工厂
Laeb · 2007-03-18 · via 博客园 - Laeb

接口 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 处理器来对请求产生回应。