概述

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:

  1. using System;
  2.  
  3. using System.Collections.Generic;
  4.  
  5. using System.Text;
  6.  
  7. using System.Web;
  8.  
  9. using System.Web.SessionState;
  10.  
  11. namespace MyHandler
  12.  
  13. {
  14.  
  15. /// <summary>
  16.  
  17. /// 目的:实现一个简单的自定义HttpHandler容器
  18.  
  19. /// 作者:文野
  20.  
  21. /// 联系:stwyhm@cnblogs.com
  22.  
  23. /// </summary>
  24.  
  25. public class MyFirstHandler : IHttpHandler,IRequiresSessionState
  26.  
  27. {
  28.  
  29. #region IHttpHandler 成员
  30.  
  31. public bool IsReusable
  32.  
  33. {
  34.  
  35. get { return true; }
  36.  
  37. }
  38.  
  39. public void ProcessRequest(HttpContext context)
  40.  
  41. {
  42.  
  43. context.Response.Write("<h1><b>Hello HttpHandler</b></h1>");
  44.  
  45. context.Session["Test"] = "测试HttpHandler容器中调用Session";
  46.  
  47. context.Response.Write(context.Session["Test"]);
  48.  
  49. }
  50.  
  51. #endregion
  52.  
  53. }
  54.  
  55. }

在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:

  1. using System;
  2.  
  3. using System.Collections.Generic;
  4.  
  5. using System.Text;
  6.  
  7. using System.Web;
  8.  
  9. namespace MyHandler
  10.  
  11. {
  12.  
  13. public class MyHandlerFactory : IHttpHandlerFactory
  14.  
  15. {
  16.  
  17. #region IHttpHandlerFactory 成员
  18.  
  19. public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
  20.  
  21. {
  22.  
  23. string fname = url.Substring(url.IndexOf('/') + );
  24.  
  25. while (fname.IndexOf('/') != -)
  26.  
  27. fname = fname.Substring(fname.IndexOf('/') + );
  28.  
  29. string cname = fname.Substring(, fname.IndexOf('.'));
  30.  
  31. string className = "MyHandler." + cname;
  32.  
  33. object h = null;
  34.  
  35. try
  36.  
  37. {
  38.  
  39. // 采用动态反射机制创建相应的IHttpHandler实现类。
  40.  
  41. h = Activator.CreateInstance(Type.GetType(className));
  42.  
  43. }
  44.  
  45. catch (Exception e)
  46.  
  47. {
  48.  
  49. throw new HttpException("工厂不能为类型"+cname+"创建实例。",e);
  50.  
  51. }
  52.  
  53. return (IHttpHandler)h;
  54.  
  55. }
  56.  
  57. public void ReleaseHandler(IHttpHandler handler)
  58.  
  59. {
  60.  
  61. }
  62.  
  63. #endregion
  64.  
  65. }
  66.  
  67. public class Handler1 : IHttpHandler
  68.  
  69. {
  70.  
  71. #region IHttpHandler 成员
  72.  
  73. public bool IsReusable
  74.  
  75. {
  76.  
  77. get { return true; }
  78.  
  79. }
  80.  
  81. public void ProcessRequest(HttpContext context)
  82.  
  83. {
  84.  
  85. context.Response.Write("<html><body><h1>来自Handler1的信息。</h1></body></html>");
  86.  
  87. }
  88.  
  89. #endregion
  90.  
  91. }
  92.  
  93. public class Handler2 : IHttpHandler
  94.  
  95. {
  96.  
  97. #region IHttpHandler 成员
  98.  
  99. public bool IsReusable
  100.  
  101. {
  102.  
  103. get { return true; }
  104.  
  105. }
  106.  
  107. public void ProcessRequest(HttpContext context)
  108.  
  109. {
  110.  
  111. context.Response.Write("<html><body><h1>来自Handler2的信息。</h1></body></html>");
  112.  
  113. }
  114.  
  115. #endregion
  116.  
  117. }
  118.  
  119. }



参考资料

《ASP.NET深入解析》

【转】一点一点学ASP.NET之基础概念——HttpModule的更多相关文章

  1. 一点一点学ASP.NET系列

    转自:http://www.cnblogs.com/stwyhm/archive/2006/08/10/473075.html 做开发近两年了,自认为自己还算是个知道要上进的人,每天不停地学习,不停地 ...

  2. 一点一点学写Makefile(3)-增加第三方库和头文件

    我们在写代码的时候不一定都是有自己来完成,一个工程中会大量使用一些比较优秀的动态库.静态库等,我们在使用这些库完成所有的代码后,需要在编译的时候将这些库使用的头文件添加到我们的工程上,将他的库文件也添 ...

  3. 合适么?现在学ASP.NET Core入门编程……

    现在都快找不到ASP.NET的培训课程了. 知道我要开课做培训,有同学劝我:“憋讲那什么.NET,讲Java,现在这个火!”我说我Java不熟,“唉呀!C#转Java,分分钟的事!以飞哥你的经验,…… ...

  4. ASP.NET Core Razor 视图导入 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Razor 视图导入 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 视图导入 上一章节我们介绍了视图起始页,学习 ...

  5. 从零开始学 ASP.NET Core 与 EntityFramework Core 目录

    从零开始学 ASP.NET Core 与 EntityFramework Core 介绍 我是一个目录,它旨在帮助开发者循序渐进的了解 ASP.NET Core 和 Entity Framework ...

  6. ASP.NET MVC基础学习

    ASP.NET MVC基础学习 传统的MVC概念 模型:组类,描述了要处理的数据以及修改和操作数据的业务规则 视图:定义应用程序用户界面的显示方式 控制器:一组类,用来处理来自用户,整个应用程序流以及 ...

  7. 一点一点看JDK源码(一)Collection体系概览

    一点一点看JDK源码(一)Collection体系概览 liuyuhang原创,未经允许进制转载 本文举例使用的是JDK8的API 目录:一点一点看JDK源码(〇) 1.综述 Collection为集 ...

  8. ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 登录登出 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 登录登出 上一章节我们总算完善了注册的功能,而且也添加了一个用户,现 ...

  9. ASP.NET Core Razor 标签助手 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core Razor 标签助手 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core Razor 标签助手 上一章节我们介绍了视图导入,学习了 ...

随机推荐

  1. TSQL--集合处理

    UNION ALL 返回两个结果集中所有的行,返回结果集中会存在重复行 UNION 返回两个结果集中去重的行,返回结果集中无重复行 INTERSECT 返回两个结果集都有的行,返回结果集中无重复行 E ...

  2. Solr相似度算法二:BM25Similarity

    BM25算法的全称是 Okapi BM25,是一种二元独立模型的扩展,也可以用来做搜索的相关度排序. Sphinx的默认相关性算法就是用的BM25.Lucene4.0之后也可以选择使用BM25算法(默 ...

  3. 使用 pdf.js 查看发票时,显示不了台头和印章的解决办法

    系统中使用了 pdf.js 来查看 PDF 文件,发现在查看 电子发票时, 缺失了很多信息, 刚开始以为是 PDF.JS 的 BUG, 后来调试发现只需要在 IIS 里添加一个 bcmap 后缀的 m ...

  4. ADO.NET操作PostgreSQL:数据库操作类(未封装)

    1.添加 /// <summary> /// 添加 /// </summary> /// <param name="newEntity">< ...

  5. WPF 组织机构下拉树多选,递归绑定方式现实

    使用HierarchicalDataTemplate递归绑定现实 XAML代码: <UserControl x:Class="SunCreate.CombatPlatform.Clie ...

  6. 云捕Redis实战

    本文由作者余宝虹授权网易云社区发布. Redis是一个支持丰富数据结构的分布式key-value系统,Redis在云捕系统的地位相当重要,碰到的问题也比较多,最近才解决了一个遗留的老大难问题.由于15 ...

  7. 索引+sql优化

    索引的概念: 索引是提高查询速度的一种手段.索引有很多种,以下是索引树的结构 要求查询出薪资大于5000的雇员信息,只要在树中找到5000的节点,直接查询该节点右边的数据即可,左边就不用管了,这样提高 ...

  8. 使用html2canvas截图并用jspdf打印的问题

    之前的方案确实可以打印出a4的大小的pdf,但是也呈现了诸多问题,因为这种方法是截图然后再进行打印的,所以打印出来的效果是模糊的,思前想后决定放弃了这种方式. 最终还是决定使用浏览器自带的打印方法. ...

  9. Nginx + uWSGI 配置django---终极版

    好开森,配置了差不多一天的项目,终于成功了,写一篇博客庆祝一下 我们先来了解下nginx与uwsgi的概念,再去配置 磨刀不误砍柴工. nginx 是一个开源的高性能的 HTTP 服务器和反向代理:1 ...

  10. BZOJ 4719--天天爱跑步(LCA&差分)

    4719: [Noip2016]天天爱跑步 Time Limit: 40 Sec  Memory Limit: 512 MBSubmit: 1464  Solved: 490[Submit][Stat ...