转自: http://www.cnblogs.com/stwyhm/archive/2006/08/09/471765.html 文野

概述

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

}

}

转自: http://www.cnblogs.com/stwyhm/archive/2006/08/09/471765.html 文野

转载于:https://www.cnblogs.com/jyan/articles/2563801.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. 深入浅出时序数据库之预处理篇——批处理和流处理,用户可定制,但目前流行influxdb没有做...
  2. 为什么要用GCD-Swift2.x
  3. 对于刷oj时因为scanf()出现wa而cin却AC的详解 【scanf() 和 cin 详解】
  4. 实现IFrame的自适应高度
  5. 打开MSN提示Windows Live Communication Platform遇到问题需要关闭错误的解决方法
  6. 【java】 ssm+ssh原生态框架(仅供参考)
  7. 电子科学与技术相关索引汇总
  8. iOS开发证件要点详解
  9. c语言 内存清除函数,C语言内存初始化函数MEMSET的用法
  10. cocos2d-x设计模式发掘之五:防御式编程模式
  11. 商城小程序源码|开源小程序商城完整源码附视频搭建教程
  12. 今日头条视频去重复上传方法-网络营销推广教程 如何完美去除视频字幕和LOGO批量下载快手西瓜视频...
  13. Linux (Ubuntu): bash: tailf: command not found
  14. matlab代码运行教程(如何运行下载的代码)
  15. Java学习笔记-Lambda表达式
  16. verilog简单驱动VGA
  17. codeforces CF487E Tourists 边双连通分量 树链剖分
  18. 看完这篇文章,线上再遇到Jedis「Redis客户端」异常相信你不再怕了!
  19. 分析pc计算机的性能方面,《腐烂国度2》PC性能表现分析 中档电脑轻松驾驭
  20. 七彩虹计算机主板维修,七彩虹C .H61U v28主板维修一例

热门文章

  1. 想到了几个不打工赚大钱的方法了呢
  2. 试编写程序,随机生成三个0-2范围内的整数,将其作为索引分别访问三个列表中的对应元素,然后进行造句。 例如,随机生成三个整数分别为1,0,2,则输出句子“小羊在草地上吃晚饭”。
  3. 电脑配置指南 以备不时之需
  4. ASP.NET Core中使用GraphQL - 最终章 Data Loader
  5. 用友U8采购暂估案例教程1月初冲回
  6. 两张表联合查询为何没有用上索引?
  7. 利用若依@Excel注解导出PDF工具类
  8. npm install报错 find module ‘semver’
  9. Java开发者!2021年Java面经分享
  10. 论文笔记:Ad Click Prediction: a View from the Trenches