博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
深入理解asp.net里的IHttpHandler
阅读量:6585 次
发布时间:2019-06-24

本文共 2272 字,大约阅读时间需要 7 分钟。

忍不住了,继续贴。

1 、概述


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

2、举例

以一个aspx页面为例,正是在HttpHandler这里,一个aspx页面才被系统处理解析,并将处理完成的结果继续经由HttpModule传递下去,直至到达客户端。当然,对于aspx页面,ASP.NET Framework在默认情况下是交给System.Web.UI.PageHandlerFactory这个
HttpHandlerFactory
来处理的。当一个HTTP请求到达这个HttpHandlerFactory时,HttpHandlerFactory会提供出一个HttpHandler容器,交由这个HttpHandler容器来处理这个HTTP请求。 
一个HTTP请求都是最终交给一个HttpHandler容器中的ProcessRequest方法来处理的。

3、HttpHandler

(1)实现HttpHandler,必须继承自IHttpHandler接口。下面是这个接口的定义:

ContractedBlock.gif
Code
(2)自定义HttpHandler

a、代码

新建一个网站,default.aspx页面:

default.aspx.cs:

ContractedBlock.gif
Code
新添一个类库MyHandler,添加一个类如下:

ContractedBlock.gif
Code
要在HttpHandler使用Session,我在旧文
里已经提及。

b、配置文件

在web.config文件的system.web节点下,添加:

      <httpHandlers>        

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

      </httpHandlers>

c、注意

<1>、.NET为asp.net提供了很多系统默认HttpHandler类,用来适应不同类型的HttpRequest。比如aspx,在machine.config中是这样定义的:    

        <add verb="*" path="*.aspx" type="System.Web.UI.PageHandlerFactory"/>

这就说明遇到aspx的Request请求,asp.net会将其交给System.Web.UI.PageHandlerFactory的HttpHandler类来处理。

<2>、如果自己定义了新的HttpHandler,而且在web.config中指定,则系统只会使用这个新的HttpHandler,而不再使用原先默认的或者指定的.

<3>、直接拷贝类库的bin目录下的文件到网站bin下.

4、HttpHandlerFactory
ASP.NET Framework实际不直接将相关的页面资源HTTP请求定位到一个其内部默认的IHttpHandler容器之上,而定位到了其内部默认的IHttpHandler工厂上。IHttpHandler工厂的作用是对IHttpHandler容器进行调度和管理,这样做的优点是大大增强了系统的负荷性,提升了效率。
(1)IHttpHandlerFactory接口
 IHttpHandlerFactory接口包含两个方法:GetHandler方法返回实现IHttpHandler接口的类的实例,ReleaseHandler方法使工厂可以重用现有的处理程序实例。

ContractedBlock.gif
Code

(2) 实现一个简单的HttpHandler工厂

类库新添一个文件MyHandlerFactor.cs:

ContractedBlock.gif
Code
网站新添两个文件,Handler1.aspx和Handler2.aspx。它们的cs文件:
ContractedBlock.gif
Code

接着重新修改配置文件:

      <httpHandlers> 
           <add verb="*" path="Handler1.aspx" type="MyHandler.MyHandlerFactory, MyHandler"/>
           <add verb="*" path="Handler2.aspx" type="MyHandler.MyHandlerFactory, MyHandler"/>
      </httpHandlers>
到这里,针对Handler1.aspx和Handler2.aspx两个页面的http请求我们就通过HttpHandler工厂处理好了。
5、HttpHandler和HttpModule的区别
主要有两点:
 (1)先后次序.先IHttpModule,后IHttpHandler,IHttpHandler处理结束后再交给IHttpModule;
 (2)对请求的处理上:
        IHttpModule是属于大小通吃类型,无论客户端请求的是什么文件,都会调用到它;例如aspx,html,rar的请求;
        IHttpHandler则属于挑食类型,只有asp.net注册过的文件类型(例如aspx,ascx,asmx等等)才会轮到调用它。

本文转自JeffWong博客园博客,原文链接:http://www.cnblogs.com/jeffwongishandsome/archive/2009/07/20/1513524.html,如需转载请自行联系原作者

你可能感兴趣的文章
七、Framework类库
查看>>
Java继承是复制还是共用?答案共用
查看>>
年终的团队公开信
查看>>
Python循环语句
查看>>
[转] http chunk
查看>>
线索二叉树
查看>>
关于时区的时间的详解,比如UTC\GMT等
查看>>
C#实现的三种方式实现模拟键盘按键
查看>>
洛谷P3327 [SDOI2015]约数个数和(莫比乌斯反演)
查看>>
java 堆和栈一般理解
查看>>
解决PLSQL Developer 插入中文 乱码问题(转)
查看>>
使用 SVN Hook 实现服务器端代码自动更新
查看>>
最炫数学风
查看>>
python 高阶函数 map lambda filter等
查看>>
windows管理员利器之用Log Parser Studio分析IIS日志(附逐浪CMS官方命令集)
查看>>
SpringMVC之HandlerMapping的使用
查看>>
扩展Microsoft Graph数据结构 - 架构扩展
查看>>
ubuntu14.04 安装 搜狗输入法
查看>>
黄聪:visual studio 2017编译运行出现脚本发生错误等问题如何解决?
查看>>
【Windows】Dos中的日期的和时间
查看>>