【IHttpHandler】了解 IHttpHandler
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接口。下面是这个接口的定义:
using System;namespace System.Web{public interface IHttpHandler{// 其他Request是否可以使用IHttpHandlerbool IsReusable { get; }// 处理HttpRequestvoid ProcessRequest(HttpContext context);}}
(2)自定义HttpHandler
新建一个网站,default.aspx页面:default.aspx.cs:
using System;using System.Collections.Generic;using System.Linq;using System.Web;using System.Web.UI;using System.Web.UI.WebControls;namespace WebApplication1{public partial class _Default : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){Response.Write("<br/>来自Default.aspx页面<br/>");}}}
新添一个类库MyHandler,添加一个类如下:
using System;using System.Web;using System.Web.SessionState;namespace WebApplication1{public class MyTestHandler : IHttpHandler, IRequiresSessionState{public bool IsReusable { get { return true; } }public void ProcessRequest(HttpContext context){context.Response.Write("<h3><b>This is a HttpHandler Test</b></h3>");context.Session["Test"] = "<h3><span style=\"color:blue;\">在HttpHandler容器中调用Session</span></h3>";context.Response.Write(context.Session["Test"]);}}}
(3)配置文件
在web.config文件的system.web节点下,添加:
<add verb="*" path="*.aspx" type="WebApplication1.MyTestHandler, WebApplication1" />
(4)注意
<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,而不再使用原先默认的或者指定的.
4、HttpHandlerFactory
ASP.NET Framework实际不直接将相关的页面资源HTTP请求定位到一个其内部默认的IHttpHandler容器之上,而定位到了其内部默认的IHttpHandler工厂上。IHttpHandler工厂的作用是对IHttpHandler容器进行调度和管理,这样做的优点是大大增强了系统的负荷性,提升了效率。
(1)IHttpHandlerFactory接口
IHttpHandlerFactory接口包含两个方法:GetHandler方法返回实现IHttpHandler接口的类的实例,ReleaseHandler方法使工厂可以重用现有的处理程序实例。
using System;using System.Web;namespace System.Web.UI{public class PageHandlerFactory : System.Web.IHttpHandlerFactory2, IHttpHandlerFactory{protected internal PageHandlerFactory();public virtual IHttpHandler GetHandler(HttpContext context, string requestType, string virtualPath, string path);public virtual void ReleaseHandler(IHttpHandler handler);}}
(2) 实现一个简单的HttpHandler工厂
类库新添一个文件MyHandlerFactor.cs:
using System;using System.Collections.Generic;using System.Linq;using System.Web;namespace WebApplication1{public class MyHandlerFactory : IHttpHandlerFactory{public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated){string fileName = url.Substring(url.LastIndexOf("/") + 1);string objName = fileName.Substring(0, fileName.IndexOf("."));string className = "WebApplication1." + objName;object objHandler = null;try{// 采用动态反射机制创建相应的IHttpHandler实现类。objHandler = Activator.CreateInstance(Type.GetType(className));context.Response.Write(className);}catch (Exception e){throw new HttpException("工厂不能为类型" + objName + "创建实例。", e);}return (IHttpHandler)objHandler;}public void ReleaseHandler(IHttpHandler handler){}}public class Handler1 : IHttpHandler{public bool IsReusable { get { return true; } }public void ProcessRequest(HttpContext context){context.Response.Write("<br/>这是来自于MyHandlerFactory里的处理.<br/>");context.Response.Write("<h3>来自Handler1的信息.</h3>");}}public class Handler2 : IHttpHandler{public bool IsReusable { get { return true; } }public void ProcessRequest(HttpContext context){context.Response.Write("<br/>这是来自于MyHandlerFactory里的处理.<br/>");context.Response.Write("<h3>来自Handler2的信息.</h3>");}}}
<add verb="*" path="Handler1.aspx" type="WebApplication1.MyHandlerFactory,WebApplication1"/><add verb="*" path="Handler2.aspx" type="WebApplication1.MyHandlerFactory,WebApplication1"/>
到这里,针对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等等)才会轮到调用它。

【IHttpHandler】了解 IHttpHandler的更多相关文章
- 【ASP.NET】IHttpHandler和IHttpModule
上篇文章我们主要讲了HttpApplicatiion管道事件,那么我么如何处理这些管道事件呢,以及请求在ASP.NET是如何执行的呢,我们来了解一下IHttpHandler和IHttpModule 引 ...
- 扩展IHttpHandler
前面提到当请求进入到IIS,IIS转发给ISAPI后会根据文件的后缀名来决定将请求转发给对应的处理程序进行处理,当然一大部分的处理都是交给了AspNet_ISAPI 了.但是,AspNet_ISAPI ...
- ASP.NET MVC 利用IRouteHandler, IHttpHandler实现图片防盗链
你曾经注意过在你服务器请求日志中多了很多对图片资源的请求吗?这可能是有人在他们的网站中盗链了你的图片所致,这会占用你的服务器带宽.下面这种方法可以告诉你如何在ASP.NET MVC中实现一个自定义Ro ...
- 在IHttpHandler中获取session
因为业务要异步通过IHttpHandler获得数据,但还要根据当前登录人员的session过滤,因此要在在IHttpHandler中获取session 方法是HttpHandler容器中如果需要访问S ...
- IHttpHandler给图片加水印
/// <summary> /// WaterMarkHandlher 的摘要说明 /// </summary> public class WaterMarkHandlher ...
- IHttpHandler防止图片链接被盗用
public class JpegHandler : IHttpHandler { public bool IsReusable { get { return true; } } public voi ...
- asp.net Web.config 在不同版本的IIS配置的IHttpHandler的访问路径,以及经典模式和集成模式不同的配置
如果IIS7.0使用.net4.0以上版本的框架,<system.web>中的httpHandlers节点就没有用了,而应该使用微软专为.net4.0以上版本设计的新节点<syste ...
- 【IHttpHandler】ASP.NET 生命周期
对由 Microsoft® Internet 信息服务 (IIS) 处理的 Microsoft® ASP.NET 页面的每个请求都会被移交到 ASP.NET HTTP 管道.HTTP 管道由一系列托管 ...
- 【IHttpHandler】使用IHttpHandler防盗链
防盗链的原理,从图片请求的URL地址上判断是否是我们自己网站上的域名,如果不是,恭喜,你的图片已经被盗链了! 那么我来介绍下图片放盗链的一个方法 首先,添加个httpHandlers请求,webcon ...
- 【IHttpHandler】HttpModule,HttpHandler,HttpHandlerFactory简单使用
这三个对象我们在开发Asp.net程序时经常会用到,似乎很熟悉,但有时候又不太确定.本文通过一个简单的例子来直观的比较一下这三个对象的使用. HttpModule:Http模块,可以在页面处理前后.应 ...
随机推荐
- [Python] UTF-8最好不要带BOM
一.问题回顾: 问题: 在写一个脚本读入IP分区表文件到list并做比较的时候,发现该成立的语句总是不成立,经调试后发现开头是这样:\xef\xbb\xbf1.0.3.0,故比较不成功. 解决办法:经 ...
- rbenv安装ruby2.3.0在线安装不上。老子出绝招了(更新)
今天把系统换成Linux mint了.感觉比ubuntu的好用太多,细节真是不错,Ubuntu感觉就是毛坯房,Linux mint真是精装修啊 问题来了.安装rbenv后,然后安装rbenv-buil ...
- Liferay中actionURL能够执行后台方法 ,但是页面不跳转问题解决方案
在学习liferay的过程中,遇到了这么一个问题,actionURL能够执行后台方法 ,但是页面不跳转,以下是两种解决方案: 方案1(不推荐此种办法): 强制将页面重定向. 在actionURL执行的 ...
- Mongo 备份 还原
表还原 mongorestore --collection Inquiry0315 -d Estate --drop --dir D:/backup/20150731/Estate/Inquiry.b ...
- editplus格式化xml文档
使用editplus打开xml文档,发现文件内容没有格式化,非常难看,使用IE9打开这个xml文档是格式化的,但是IE9打开不能编辑. 在网上找了一些资料发现能够通过一个小插件来是editplus格式 ...
- Golang 图片上绘制文字
之前介绍过使用 FreeType-go 来绘制字(http://www.cnblogs.com/ghj1976/p/3445568.html), 现在相关的包被做了整合,主要是整合到了 github ...
- nyoj 106 背包问题
点击打开链接 背包问题 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v ...
- eclipse高效快捷键
代码快速对齐:Ctrl+shift+f 添加注释,取消注释:Ctrl+shift+/ Ctrl+shift+\ Ctrl+/ Alt+Shift+R:一秒钟重命名 Ctrl+D:一秒钟删除行 ...
- Python第九章模块和包(2)
1.如果文件下没有__init__.py文件,程序将不会认为这是一个Python的包. 2.如果要使用from 包 import * 则需要 这样做. 是模块中包含 方法 的文件没有包含类: # ...
- Machine Schedule(最小覆盖)
其实也是个最小覆盖问题 关于最小覆盖http://blog.csdn.net/u014665013/article/details/49870029 Description As we all kno ...