• 利用 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

  • 相关阅读:
    mysql replication常见错误整理
    enq: TX
    LOGMNR分析redo log和archive log教程
    使用create datafile... as ...迁移数据文件到裸设备
    mysql无法启动,报错 Can't start server: can't create PID file: No space left on device
    MYSQL 权限设置查询
    ORA-02437 违反主键
    oracle sequence的用法
    sequence有关问题
    关于Relay Log无法自动删除的问题
  • 原文地址:https://www.cnblogs.com/liuning8023/p/2268445.html
Copyright © 2020-2023  润新知