利用 IHttpHandler 自定义 HTTP 处理程序

本文内容

  • 引入
  • IHttpHandler 概述
  • 演示创建自定义 HTTP 处理程序
  •     创建自定义 HTTP 处理程序
  •     映射文件扩展名
  •     测试自定义 HTTP 处理程序
  • 参考资料

 

引入

当新建一个名为 WebForm1 的 .aspx 文件后,这个页面相应的 .aspx.cs 文件内容如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
 
namespace HttpHandlerDemo
{
    public partial class WebForm1 : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
 
        }
    }
}

任何人对这个页面再熟悉不过。但更进一步,这个后台文件继承 System.Web.UI.Page 类,而该类又继承 System.Web.UI.TemplateControl 类和 System.Web.IHttpHandler 接口。值得注意的是 IHttpHandler。

 

本文在 VS 2008 和 IIS 6 环境下概述如何利用 IHttpHandler 自定义 HTTP 处理程序。

本文重在工程实践,以实践看理论,这多少符合点参加工作的人实际情况。我是比较讨厌大段大段的文字描述和理论的。虽然写得简单,但若深究下去涉及的问题实在很多,随便写点什么,都可以成为专门的主题。

在网上或是群里看到太多人问得问题,一是自己不思考,稍微遇到点问题,就迫切寻求他人帮助;二是基础太差,知识量不够,或是知道的过于肤浅。这些都是阻碍自己进步的巨大障碍。

在本文的描述中,希望能体会、意识到 IHttpHandler 能做什么、能为你的项目做什么。

学习的过程不能一蹴而就,起初你只是知道一个个信息点,一个个实现方式,但若坚持下去,认真思考它们内在的东西,最终这些信息在你脑中会形成一个体系。

 

IHttpHandler 概述

IHttpHandler 是 ASP.NET 提供一个底层的请求/响应 API,使开发人员可以利用 .NET Framework 为到来的 HTTP 请求服务。因此,你可以创建自己的 HTTP 处理程序,将自定义输出呈现给浏览器。

ASP.NET HTTP 处理程序是响应对 Web 应用程序的请求而运行的过程。最常见的处理程序是处理 .aspx 文件的 ASP.NET 页处理程序。用户请求 .aspx 文件时,页面通过页处理程序来处理请求。

自定义 HTTP 处理程序通常具有以下用途:

  • RSS 源。若要为网站创建 RSS 源,可以创建一个可发出 RSS 格式 XML 处理程序。然后将文件扩展名,如 .rss,绑定你自定义的处理程序。当用户向站点发送以 .rss 结尾的请求时,ASP.NET 将调用你自定义的处理程序来处理该请求。
  • 图像服务器。如果希望 Web 应用程序能够提供不同大小的图像,可以编写一个自定义处理程序来调整图像大小,将调整后的图像作为处理程序的响应发送给用户。

除了 ASP.NET 页面处理程序外,ASP.NET 还有其他几种内置的处理程序。如下表所示:

处理程序 说明
ASP.NET 页处理程序 (*.aspx) 用于所有 ASP.NET 页的默认 HTTP 处理程序。
Web 服务处理程序 (*.asmx) 在 ASP.NET 中作为 .asmx 文件创建的 Web 服务页的默认 HTTP 处理程序。
泛型 Web 处理程序 (*.ashx) 不含 UI 和包括 @ WebHandler 指令的所有 Web 处理程序的默认 HTTP 处理程序。
跟踪处理程序 (trace.axd) 显示当前页跟踪信息的处理程序。

 

演示创建自定义 HTTP 处理程序

创建自定义 HTTP 处理程序

若要创建自定义 HTTP 处理程序,需要创建实现 IHttpHandler 接口的类。这是一个同步处理程序(实现 IHttpAsyncHandler 可以创建一个异步处理程序,两种处理程序接口都要求您实现 IsReusable 属性和 ProcessRequest 方法)。

  • IsReusable 属性指定 IHttpHandlerFactory 对象(实际调用适当处理程序的对象)是否可以将处理程序放置在池中,并且重新使用它以提高性能。如果处理程序不能放在池中,则在每次需要处理程序时工厂都必须创建处理程序的新实例。
  • ProcessRequest 方法负责处理单个 HTTP 请求。

HTTP 处理程序有权访问应用程序上下文。其中包括请求用户的标识(如果已知)、应用程序状态和会话信息。当请求 HTTP 处理程序时,ASP.NET 将调用相应处理程序的 ProcessRequest 方法。您在处理程序的 ProcessRequest 方法中编写的代码将创建一个响应,此响应随后发送回请求浏览器。

如下所示创建一个名为 HelloWorldHandler 的处理程序:

using System;
using System.Web;
 
namespace HttpHandlerDemo
{
    public class HelloWorldHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            HttpRequest Request = context.Request;
            HttpResponse Response = context.Response;
            Response.Write("<html>");
            Response.Write("<body>");
            Response.Write("<h1>Hello from a synchronous custom HTTP handler.</h1>");
            Response.Write("</body>");
            Response.Write("</html>");
        }
 
        public bool IsReusable
        {
            get
            {
                return true;
            }
        }
    }
}
映射文件扩展名

HelloWorldHandler 处理程序可以响应尚未在 IIS 和 ASP.NET 中映射的任何文件扩展名。

为了使 ASP.NET 了解为你的自定义文件扩展名使用哪个处理程序,在 IIS 中必须将该扩展名映射到 ASP.NET。然后在应用程序中必须将该扩展名映射到自定义处理程序。

如下所示:

<httpHandlers>
  <add verb="*" path="*.sample" type="HttpHandlerDemo.HelloWorldHandler"/>
</httpHandlers>

测试自定义 HTTP 处理程序

这样,当你输入 http://localhost/mytest.sample,任何以 .sample 结尾的请求时,都会调用 HelloWorldHandler 处理程序。

运行结果:

aa

 

参考资料

MSDN HTTP 处理程序和 HTTP 模块概述 http://msdn.microsoft.com/zh-cn/library/bb398986(v=VS.90).aspx

.NET Framework IHttpHandler http://msdn.microsoft.com/zh-cn/library/system.web.ihttphandler(v=VS.90).aspx

 

下载 Demo

posted @ 2011-11-29 23:38  船长&CAP  阅读(701)  评论(0编辑  收藏  举报
免费流量统计软件