当前位置: 首页 > news >正文

ASP.NET 框架 之HttpHandler

转载:

 

 

概述

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

 

IHttpHandler是什么

IHttpHandler定义了如果要实现一个HTTP请求的处理所必需实现的一些系统约定。HttpHandlerHttpModule不同,一旦定义了自己的HttpHandler类,那么它对系统的HttpHandler的关系将是“覆盖”关系。

 

IHttpHandler如何处理HTTP请求

当一个HTTP请求经同HttpModule容器传递到HttpHandler容器中时,ASP.NET Framework会调用HttpHandlerProcessRequest成员方法来对这个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方法来处理的。


1ProcessRequest方法

 


一个简单的
HttpHandler容器

通过实现IHttpHandler接口可以创建自定义HTTP处理程序,该接口只包含两个方法。通过调用IsReusableIHttpHandlerFactory可以查询处理程序以确定是否可以使用同一实例为多个请求提供服务。ProcessRequest方法将HttpContext实例用作参数,这使它能够访问RequestResponse内部对象。在一个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

    }

}




相关文章:

  • 判断“textbox为空”写法
  • Using System.Threading
  • Windows Server 2008 参考价格
  • 我是一个*** (九)
  • SET NOCOUNT 使用说明
  • JSP学习笔记(二十一):struts2中访问request,application对象
  • vb.net中的键盘事件处理
  • 开源与云计算
  • 我的博客也是男的(还好)
  • 转自Microsoft-DDOS处理参考-如何:强化 TCP/IP 堆栈安全
  • 普天C++笔试题
  • 在 VS 中查找替换时使用正则表达式的语法
  • 剧透和评析之車輪の国、向日葵の少女
  • 《案例精解企业级网络构建》书评
  • 笔记本电脑的硬件知识
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • Angular4 模板式表单用法以及验证
  • echarts的各种常用效果展示
  • Git同步原始仓库到Fork仓库中
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 解决iview多表头动态更改列元素发生的错误
  • 免费小说阅读小程序
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • ​ArcGIS Pro 如何批量删除字段
  • #100天计划# 2013年9月29日
  • (14)学习笔记:动手深度学习(Pytorch神经网络基础)
  • (定时器/计数器)中断系统(详解与使用)
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (最优化理论与方法)第二章最优化所需基础知识-第三节:重要凸集举例
  • .a文件和.so文件
  • .NET Compact Framework 多线程环境下的UI异步刷新
  • .net core 源码_ASP.NET Core之Identity源码学习
  • /etc/skel 目录作用
  • @RequestMapping 的作用是什么?
  • @RestControllerAdvice异常统一处理类失效原因
  • [BZOJ1877][SDOI2009]晨跑[最大流+费用流]
  • [Eclipse] 详细设置护眼背景色和字体颜色并导出
  • [IE技巧] IE 中打开Office文件的设置
  • [Linux_IMX6ULL驱动开发]-基础驱动
  • [linux学习]apt-get参数解析
  • [Markdown] 02 简单应用 第二弹
  • [nlp] tokenizer
  • [NOI2012]迷失游乐园
  • [NSSCTF 2nd] web刷题记录
  • [one_demo_6]逆置整数
  • [RISC-V]verilog
  • [saiku] olap数据源管理
  • [SoftGrid 系列] Microsoft SoftGrid Server 安装篇
  • [UIUCTF 2022] crypto ASR,WringingRing
  • [uniapp] uni-ui+vue3.2小程序评论列表组件 回复评论 点赞和删除