概述

HttpHandler是一个HTTP请求的真正处理中心,也正是在这个HttpHandler容器中,ASP.NET Framework才真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。

IHttpHandler是什么

IHttpHandler定义了如果要实现一个HTTP请求的处理所必需实现的一些系统约定。HttpHandler与HttpModule不同,一旦定义了自己的HttpHandler类,那么它对系统的HttpHandler的关系将是“覆盖”关系。

IHttpHandler如何处理HTTP请求

当一个HTTP请求经同HttpModule容器传递到HttpHandler容器中时,ASP.NET Framework会调用HttpHandler的ProcessRequest成员方法来对这个HTTP请求进行真正的处理。以一个ASPX页面为例,正是在这里一个ASPX页面才被系统处理解析,并将处理完成的结果继续经由HttpModule传递下去,直至到达客户端。

对于ASPX页面,ASP.NET Framework在默认情况下是交给System.Web.UI.PageHandlerFactory这个HttpHandlerFactory来处理的。所谓一个HttpHandlerFactory,所谓一个HttpHandlerFactory,是指当一个HTTP请求到达这个HttpHandler Factory时,HttpHandlerFactory会提供出一个HttpHandler容器,交由这个HttpHandler容器来处理这个HTTP请求。

一个HTTP请求都是最终交给一个HttpHandler容器中的ProcessRequest方法来处理的。


图1:ProcessRequest方法


一个简单的
HttpHandler容器

通过实现IHttpHandler接口可以创建自定义HTTP处理程序,该接口只包含两个方法。通过调用IsReusable,IHttpHandlerFactory可以查询处理程序以确定是否可以使用同一实例为多个请求提供服务。ProcessRequest方法将HttpContext实例用作参数,这使它能够访问Request和Response内部对象。在一个HttpHandler容器中如果需要访问Session,必须实现IRequiresSessionState接口,这只是一个标记接口,没有任何方法。

示例1:

using System;

using System.Collections.Generic;

using System.Text;

using System.Web;

using System.Web.SessionState;

namespace MyHandler

{

/// <summary>

/// 目的:实现一个简单的自定义HttpHandler容器

/// 作者:文野

/// 联系:stwyhm@cnblogs.com

/// </summary>

public class MyFirstHandler : IHttpHandler,IRequiresSessionState

{

#region IHttpHandler 成员

public bool IsReusable

{

get { return true; }

}

public void ProcessRequest(HttpContext context)

{

context.Response.Write("<h1><b>Hello HttpHandler</b></h1>");

context.Session["Test"] = "测试HttpHandler容器中调用Session";

context.Response.Write(context.Session["Test"]);

}

#endregion

}

}

在Web.config中加入如下配置:

<httpHandlers>

<add verb="*" path="*" type="MyHandler.MyFirstHandler, MyHandler"/>

</httpHandlers>

IHttpHandler工厂

ASP.NET Framework实际不直接将相关的页面资源HTTP请求定位到一个其内部默认的IHttpHandler容器之上,而定位到了其内部默认的IHttpHandler工厂上。IHttpHandler工厂的作用是对IHttpHandler容器进行调度和管理。

IHttpHandlerFactory接口包含两个方法。GetHandler返回实现IHttpHandler接口的类的实例,ReleaseHandler使工厂可以重用现有的处理程序实例。

示例2:

using System;

using System.Collections.Generic;

using System.Text;

using System.Web;

namespace MyHandler

{

public class MyHandlerFactory : IHttpHandlerFactory

{

#region IHttpHandlerFactory 成员

public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)

{

string fname = url.Substring(url.IndexOf('/') + 1);

while (fname.IndexOf('/') != -1)

fname = fname.Substring(fname.IndexOf('/') + 1);

string cname = fname.Substring(0, fname.IndexOf('.'));

string className = "MyHandler." + cname;

object h = null;

try

{

// 采用动态反射机制创建相应的IHttpHandler实现类。

h = Activator.CreateInstance(Type.GetType(className));

}

catch (Exception e)

{

throw new HttpException("工厂不能为类型"+cname+"创建实例。",e);

}

return (IHttpHandler)h;

}

public void ReleaseHandler(IHttpHandler handler)

{

}

#endregion

}

public class Handler1 : IHttpHandler

{

#region IHttpHandler 成员

public bool IsReusable

{

get { return true; }

}

public void ProcessRequest(HttpContext context)

{

context.Response.Write("<html><body><h1>来自Handler1的信息。</h1></body></html>");

}

#endregion

}

public class Handler2 : IHttpHandler

{

#region IHttpHandler 成员

public bool IsReusable

{

get { return true; }

}

public void ProcessRequest(HttpContext context)

{

context.Response.Write("<html><body><h1>来自Handler2的信息。</h1></body></html>");

}

#endregion

}

}


转载于:https://www.cnblogs.com/lds85930/archive/2008/09/07/1286364.html

HttpHandler相关推荐

  1. ASP.NET的(HttpModule,HttpHandler)

    在以前的ASP时候,当请求一个*.asp页面文件的时候,这个HTTP请求首先会被一个名为inetinfo.exe进程所截获,这个进程实际上就是www服务.截获之后它会将这个请求转交给asp.dll进程 ...

  2. ASP.NET 2.0 HttpHandler实现生成图片验证码(示例代码下载)

    学习整理了一下 (一).功能 用HttpHandler实现图片验证码 (二).代码如下 1. 处理程序文件 ValidateImageHandler.ashx代码如下  1 <%@ WebHan ...

  3. HttpModule与HttpHandler详解

    ASP.NET对请求处理的过程: 当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll, ...

  4. ashx文件和HttpHandler

    ashx 文件用于写web handler的..ashx必须包含IsReusable. 如下例所示.}.ashx比.aspx的好处在与不用多一个html 注意了VS2005中Web应用程序项目模板里的 ...

  5. HttpHandler与HttpModule区别

    ASP.Net处理Http Request时,使用Pipeline(管道)方式,由各个HttpModule对请求进行处理,然后到达 HttpHandler,HttpHandler处理完之后,仍经过Pi ...

  6. ASP.Net中自定义Http处理及应用之HttpHandler篇

    摘自:http://hi.baidu.com/irinihp/blog/item/c96a011ea1f78ff31ad576f8.html 很多时候,我们新建一个xxx.aspx页和xxx.aspx ...

  7. 选择HttpHandler还是HttpModule?

    阅读目录 开始 理解ASP.NET管线 理解HttpApplication 理解HttpHandler 理解HttpModule 三大对象的总结 案例演示 如何选择? 最近收到几个疑问:HttpHan ...

  8. HttpModule与HttpHandler详解(转)

    一 asp.net请求的处理过程 ------------------- HttpModule必须要掌握的东西 HttpHandler 必须要掌握的东西,非常有用 以上两个的实例 ---------- ...

  9. 理解并自定义HttpHandler

    前言 之前从网上找了几篇讲解如何自定义HttpHandler的文章,依葫芦画瓢却一直没成功过.经过上一篇<asp.net管道模型(管线模型)之一发不可收拾>的总结,对管道模型和请求/响应过 ...

  10. 5 HttpHandler

    HttpHandler是定义 ASP.NET 为使用自定义 HTTP 处理程序同步处理 HTTP Web 请求而实现的协定,是对请示的响应,可以输出普通的html内容,也可以输入图片或文件(下载也可) ...

最新文章

  1. Jenkins与SVN持续集成
  2. 美创企推出仅90斤的物流无人车,成本低至5000美元
  3. 弗吉尼亚理工大学(Virginia Tech)NCR校区招收计算机硕士学位研究生
  4. 可输入可下拉的输入选择框
  5. python字典遍历 没有顺序_Python实现字典的遍历与排序功能示例
  6. 网盘中搭建git服务
  7. 【技术博客】 利用Postman和Jmeter进行接口性能测试
  8. 导航猫(NaviCat for MySql)建立表的方法
  9. html5文字收起,科技常识:HTML5给汉字加拼音收起展开组件的实现代码
  10. 我的天!!线上千万级大表排序,如何优化?
  11. Tensorflow Day1
  12. btrfs文件系统学习总结
  13. 台式计算机麦说不了话,耳机有声音麦克风没声音怎么办?解决电脑耳机有声音麦不能说话...
  14. 重磅!中国首家互联网银行联手腾讯、华为各大APP,最高5万额度,疯狂提额100亿!!!...
  15. 在演讲中如何吸引你的听众技巧
  16. “挂羊头卖狗肉”的宇宙学谭
  17. Java——字母大小写全排列
  18. 【图像分类】Deep Layer Aggregation论文理解
  19. 模拟网易云的H5音乐播放器
  20. 16 tia 内容说明 安装包_博途v12|Tia Portal v12下载 附安装说明 - 121下载站

热门文章

  1. Jenkins 部署vue到服务器
  2. JVM初探:内存分配、GC原理与垃圾收集器
  3. centos7安装oracle12c 三
  4. 那些年收藏的技术文章(一) CSDN篇
  5. [4]Telerik Grid 简单使用方法
  6. 财务管理(Finance Management)
  7. Java的多进程运行模式分析
  8. Dataset和DataLoader构建数据通道
  9. 5895. 获取单值网格的最小操作数
  10. leetcode 57. 插入区间