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

    }

}




转载于:https://www.cnblogs.com/lds85930/archive/2008/09/07/1286364.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/411608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[html] 为什么HTML5只需要写<!DOCTYPE HTML>就可以?

[html] 为什么HTML5只需要写就可以&#xff1f; 因为 HTML5 与 HTML4 基于的基准不同。HTML4 基于 SGML 因此需要除了 DOCTYPE 外还需要引入 DTD 来告诉浏览器用什么标准进行渲染。DTD 还分为标准模式、严格模式。如果什么都不写&#xff0c;就完全让浏览器自我发挥&#xff0…

小程序云开发搜索功能的实现正则_码code | 如何借助小程序云开发实现小程序支付功能...

转载来源&#xff1a;编程小石头我们在做小程序支付相关的开发时&#xff0c;总会遇到这些难题。小程序调用微信支付时&#xff0c;必须要有自己的服务器&#xff0c;有自己的备案域名&#xff0c;有自己的后台开发。这就导致我们做小程序支付时的成本很大。本节就来教大家如何…

python接口自动化(二十五)--unittest断言——下(详解)

简介 本篇还是回归到我们最初始的话题&#xff0c;想必大家都忘记了&#xff0c;没关系看这里&#xff1a;传送门 没错最初的话题就是登录&#xff0c;由于博客园的登录机制改变了&#xff0c;本篇以我找到的开源免费的登录API为案例&#xff0c;结合 unittest 框架写 2 个用例…

使用C#和Excel进行报表开发(五)-操作单元格边框和颜色 【转】

在用Excel作报表的时候&#xff0c;可能需要操作单元格的边框和填充颜色和纹理等操作&#xff0c;下面的代码说明如何设置选中的单元格的填充纹理和边框try{ThisApplication new Excel.Application();ThisWorkbook ThisApplication.Workbooks.Open("z:\\Book1.xls"…

输入 3 个正数,判断能否构成一个三角形。

package com.my.demo;import java.util.Scanner;public class Triangle {public static void main(String[] args) {System.out.println("请输入三个正整数&#xff1a;");Scanner sc1new Scanner(System.in);int asc1.nextInt();int bsc1.nextInt();int csc1.nextIn…

mysql-bin磁盘满数据库重启不_liunx磁盘空间满了,导致mysql数据库无法启动

如何启动/遏制/重启MySQLA、1、启动圆式1、哄骗 service 启动&#xff1a;service mysqld start2、哄骗 mysqld 脚本启动&#xff1a;/etc/inint.d/mysqld start3、哄骗 safe_mysqld 启动&#xff1a;safe_mysqld&二、遏制1、哄骗 service 启动&#xff1a;service mysqld …

[html] title与h1的区别、b与strong的区别、i与em的区别?

[html] title与h1的区别、b与strong的区别、i与em的区别&#xff1f; title 是 网页标题标签 h1 是文本标签 默认与word的h1相似为最大的标题显示 b 为文本加粗标签 与word的加粗功能相似 strong 为强调语气&#xff0c; 也是为文本加粗 与b标签是有不同 i 标签为斜体 常用于阿…

两个日期的 月差

datediff(DateInterval.Month,date1,date2) 转载于:https://www.cnblogs.com/lhuser/articles/1288289.html

[html] HTML5的文件离线储存怎么使用,工作原理是什么?

[html] HTML5的文件离线储存怎么使用&#xff0c;工作原理是什么&#xff1f; localstorge 利用浏览器的本地存储可以缓存信息 &#xff0c;在创建数据的时候引入创建好的数据 cookie 好像也可以个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&…

springboot忽略证书_SpringBoot获取resource下证书失败

1.第一种失败的情况&#xff1a;本来使用Spring的上下文容器获取文件&#xff0c;将证书文件放在resource下&#xff0c;编译后获取文件会出现报错java.security.spec.InvalidKeySpecException: java.security.InvalidKeyException: IOException : DerInputStream.getLength():…

看一个国家的国民教育&#xff0c;要看他的公共厕所。 看一个男人的品味&#xff0c;要看他的袜子。 看一个女人是否养尊处优&#xff0c;要看她的手。 看一个人的气血&#xff0c;要看他的头发。 看一个人的心术&#xff0c;要看他的眼神。 看一个人的身价&#xff0c;要…

死锁产生的原因及条件和手写死锁

什么是死锁&#xff1f; 由于两个或者多个线程互相持有对方所需要的资源&#xff0c;导致线程处于等待状态&#xff0c;造成死锁。 为什么会产生死锁&#xff08;为什么会互相占用对方的资源&#xff09; 因为系统资源不足。 进程运行推进的顺序不合适。 资源分配不当等。产生死…

[html] iframe框架都有哪些优缺点?

[html] iframe框架都有哪些优缺点&#xff1f; 优点重载页面时不需要重载整个页面&#xff0c;只需要重载页面中的一个框架页技术易于掌握&#xff0c;使用方便&#xff0c;可主要应用于不需搜索引擎来搜索的页面方便制作导航栏缺点会产生很多页面&#xff0c;不容易管理*不容…

mysql 默认page大小_Innodb优化之修改页大小

MySQL在使用innodb引擎的时候页大小默认是16K&#xff0c;这个大小对于很多应用来说太大了&#xff0c;很多在其他数据如ORACLE运行良好的应用迁移到innodb后发现IO压力偏大&#xff0c;MySQL本身没有提供修改页大小的参数&#xff0c;但是我们可以通过修改源码重新编译mysql来…

[导入]C# Tips 2 右键单击listBox时弹出右键菜单并选中单击的行

C#,Listbox,右键,菜单,选中文章来源:http://blog.csdn.net/geyunfei_hit/archive/2008/07/16/2661153.aspx 转载于:https://www.cnblogs.com/geyunfei/archive/2008/10/08/1306335.html

[html] 常见的浏览器内核都有哪些?并介绍下你对内核的理解

[html] 常见的浏览器内核都有哪些&#xff1f;并介绍下你对内核的理解 Webkit Blink Gecko Trident个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

python真的可以减少工作强度_用Python写几行代码,一分钟搞定一天工作量,同事直呼:好家伙!...

前几天有一个读者说最近要整理几千份文件&#xff0c;头都要整秃了&#xff0c;不知道能不能用Python解决&#xff0c;我们来看一下&#xff0c;你也可以思考一下。由于涉及文件私密所以具体内容已做脱敏处理。大概是这样&#xff0c;一个文件夹下有多份会议通知信息(本文以 7 …

[html] 说说你对html中的置换元素和非置换元素的理解

[html] 说说你对html中的置换元素和非置换元素的理解 置换元素是指&#xff1a;浏览器根据元素的标签和属性&#xff0c;来决定元素的具体显示内容。例如&#xff1a;浏览器根据标签的src属性显示图片。根据标签的type属性决定显示输入框还是按钮。非置换元素&#xff1a;浏览器…

Jmeter之逻辑控制器(Logic Controller)

一、简单控制器&#xff08;Simple Controller&#xff09;&#xff1a; 作用&#xff1a;这是Jmeter里最简单的一个控制器&#xff0c;它可以让我们组织我们的采样器和其它的逻辑控制器&#xff08;分组功能&#xff09;&#xff0c;提供一个块的结构和控制&#xff0c;并不具…

python需要掌握的词汇量_北大保安英语词汇量1.5万,会用Python编程,孟母三迁真有道理...

这就是良好学习环境的重要性啊&#xff0c;不然你以为“孟母三迁”是咋来的&#xff1f;人家孟母为了孩子有个好的学习环境&#xff0c;宁愿搬三次家。而这些保安小哥一步到位&#xff0c;直接就进入了无数人梦寐以求的最高学府&#xff0c;想不牛都不行啊。01、北大是最高学府…