HttpHandler详解
概述
HttpHandler是一个HTTP请求的真正处理中心,也正是在这个HttpHandler容器中,ASP.NET Framework才真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。
IHttpHandler是什么
IHttpHandler定义了如果要实现一个HTTP请求的处理所必需实现的一些系统约定。HttpHandler与HttpModule不同,一旦定义了自己的HttpHandler类,那么它对系统的HttpHandler的关系将是“覆盖”关系。
IHttpHandler如何处理HTTP请求
当一个HTTP请求经同HttpModule容器传递到HttpHandler容器中时,ASP.NET Framework会调用HttpHandler的Proce***equest成员方法来对这个HTTP请求进行真正的处理。以一个ASPX页面为例,正是在这里一个ASPX页面才被系统处理解析,并将处理完成的结果继续经由HttpModule传递下去,直至到达客户端。
对于ASPX页面,ASP.NET Framework在默认情况下是交给System.Web.UI.PageHandlerFactory这个HttpHandlerFactory来处理的。所谓一个HttpHandlerFactory,所谓一个HttpHandlerFactory,是指当一个HTTP请求到达这个HttpHandler Factory时,HttpHandlerFactory会提供出一个HttpHandler容器,交由这个HttpHandler容器来处理这个HTTP请求。
一个HTTP请求都是最终交给一个HttpHandler容器中的Proce***equest方法来处理的。
一个简单的HttpHandler容器
通过实现IHttpHandler接口可以创建自定义HTTP处理程序,该接口只包含两个方法。通过调用IsReusable,IHttpHandlerFactory可以查询处理程序以确定是否可以使用同一实例为多个请求提供服务。Proce***equest方法将HttpContext实例用作参数,这使它能够访问Request和Response内部对象。在一个HttpHandler容器中如果需要访问Session,必须实现IRequiresSessionState接口,这只是一个标记接口,没有任何方法。
示例1:
[csharp] view plaincopy
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 Proce***equest(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中加入如下配置:
[html] view plaincopy
<httpHandlers>
<add verb="*" path="*" type="MyHandler.MyFirstHandler, MyHandler"/>
</httpHandlers>
IHttpHandler工厂
ASP.NET Framework实际不直接将相关的页面资源HTTP请求定位到一个其内部默认的IHttpHandler容器之上,而定位到了其内部默认的IHttpHandler工厂上。IHttpHandler工厂的作用是对IHttpHandler容器进行调度和管理。
IHttpHandlerFactory接口包含两个方法。GetHandler返回实现IHttpHandler接口的类的实例,ReleaseHandler使工厂可以重用现有的处理程序实例。
示例2:
[csharp] view plaincopy
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 Proce***equest(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 Proce***equest(HttpContext context)
{
context.Response.Write("<html><body><h1>来自Handler2的信息。</h1></body></html>");
}
#endregion
}
}
HttpHandler详解相关推荐
- HttpModule与HttpHandler详解
ASP.NET对请求处理的过程: 当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之后,将这个请求转交给 ASPNET_ISAPI.dll, ...
- HttpModule与HttpHandler详解(转)
一 asp.net请求的处理过程 ------------------- HttpModule必须要掌握的东西 HttpHandler 必须要掌握的东西,非常有用 以上两个的实例 ---------- ...
- httphandler java_HttpModule与HttpHandler详解
ASP.NET对请求处理的过程: 当请求一个*.aspx文件的时候,这个请求会被inetinfo.exe进程截获,它判断文件的后缀(aspx)之 后,将这个请求转交给 ASPNET_ISAPI.dll ...
- ASP.NET MVC Controller激活系统详解:默认实现
Controller激活系统最终通过注册的ControllerFactory创建相应的Conroller对象,如果没有对ControllerFactory类型或者类型进行显式注册(通过调用当前Cont ...
- Python日志详解【两篇就够了系列】--第一篇logging
目录 第一章 Python日志模块logging详解 一.logging的框架 1.Logger 2.Handler 3.Formater类 4.Filter类 二.Log级别 三.Log格式 四.常 ...
- Ocelot简易教程(三)之主要特性及路由详解
作者:依乐祝 原文地址:https://www.cnblogs.com/yilezhu/p/9664977.html 上篇<Ocelot简易教程(二)之快速开始2>教大家如何快速跑起来一个 ...
- IIS负载均衡-Application Request Route详解第四篇:使用ARR实现三层部署架构
本篇的主要目的是带领大家一起来使用ARR来实现一个三层部署架构.这里的三层部署架构主要是由:服务层,应用程序服务器层已经数据层实现.如下图所示: 每次一提到"层"这个字的时候,似乎 ...
- ASP.NET页面与IIS底层交互和工作原理详解(一)
第一回: 引言 我查阅过不少Asp.Net的书籍,发现大多数作者都是站在一个比较高的层次上讲解Asp.Net.他们耐心.细致地告诉你如何一步步拖放控件.设置控件属性.编写CodeBehind代码,以实 ...
- (转)asp.net夜话之十一:web.config详解
在开发中经常会遇到这样的情况,在部署程序时为了保密起见并不将源代码随项目一同发布,而我们开发时的环境与部署环境可能不一致(比如数据库不一样),如果在代码中保存这些配置这些信息部署时需要到用户那里更改代 ...
最新文章
- 移动端AR的适用分析(二)
- 精品软件 推荐 硬盘物理序列号修改专家
- i27岁转行java,JavaTM I/O 性能分析[转]
- kettle优化抽取数据速度_数据异构工具介绍
- Python(23)-面向对象2-继承,多态
- eclipse无法打开.ftl文件或打开.ftl没提示
- 技术分享丨华为鲲鹏架构Redis知识二三事
- text-align 属性,输入框数字向右靠
- 南阳理工ACM 题目252 01串
- c++实习岗面试经历
- 关于vue的@click传递
- 大写金额转换小写数字金额(美图2017线下笔试题)
- 使用微信PC端的截图dll库实现微信截图功能(C++ Builder实现)
- 文化袁探索专栏——React Native启动流程
- 干货分享 | FMEA何时做?谁来做?
- WPF基础到企业应用系列8——依赖属性之“风云再起”
- linux使用ftp命令_如何在Linux上使用FTP命令
- LaTeX之公式及编号
- win7+VS2008 System.Runtime.InteropServices.COMException
- 3g html5手机网站,手机网站新模式 3G门户HTML5概念版问世