浅谈IHttpHandler
在Web应用开发或接口开发时,处理请求接口IHttpHandler随处可见,那么我们这次来简单聊一下这个接口。
ASP.NET响应Http请求时常用的两个处理接口,分别是IHttpHandler和IHttpModule。
1、IHttpHandler
一般用来处理一类特定的请求,比如对每个*.asp, *.aspx文件的分别处理。
2、IHttpModule
通常用来处理所以请求共同需要的操作,比如对所以请求页面进行某些相同的检查功能。
我们先来看一下IIS服务器在相应Http请求时的处理步骤。

请求到达之后,实现经过HttpModule处理之后再调用HttpHandler的ProcessRequest()方法进行具体相应的。因此,也不难理解为什么说在HttpModule中做一些对所有请求通用的检查操作,而将特定类请求的处理放在HttpHandler类中。
一、IHttpHandler
首先我们来看一下IHttpHandler接口设计。
IHttpHandler接口只有两个成员:
public interface IHttpHandler
{
bool IsReusable { get; }
void ProcessRequest(HttpContext context);
}
1、IsReusable:标识该HttpHandler对象能否被其他实例使用,一般我们将其置为True。
2、ProcessRequest():具体响应请求方法,我们只要将具体的业务逻辑操作放在这里即可。
实践:
新建一个Web工程,添加一个Handler类:
public class RayHandler : IHttpHandler
{
public bool IsReusable
{
get { return true; }
} public void ProcessRequest(HttpContext context)
{
context.Response.Write("Asp.Net HttpHandler Demo. -- .");
}
}
然后,我们需要在Web.config文件中添加以下配置:
<handlers>
<add name="test" path="*.ray" verb="*" type="WebApplication2.RayHandler,WebApplication2"/>
</handlers>
对config文件中的几个属性做一下说明:
1、path:表示URL匹配,如*.ray这表示该Handler会响应所以以".ray"结尾的URL请求。
2、verb:表示请求方法,如Get/Post,使用*则表示所以匹配所有。
3、type:指示Handler类的类型,上面的config文件中,WebApplication2.RayHandler是类名,WebApplication2是指Bin目录下该该程序集的名称(不带.dll后缀)。
启动站点,输入以".ray"结尾的URL,可以看到如下结果:

问题:
有时候我们可能需要处理多种不同的后缀,一个后缀对应一个Handler类,这时我们的Web.config文件看起来就是这样了:
<handlers>
<add name="test" path="*.ray" verb="*" type="WebApplication2.RayHandler,WebApplication2"/>
<add name="test1" path="*.rss" verb="*" type="WebApplication2.RssHandler,WebApplication2"/>
</handlers>
如果我们有很多的HttpHandler实现类,那么我们的Web.config文件配置势必会显得很冗长。
解决问题:
为了解决以上问题,需要使用IHttpHandlerFactory。一看这个接口的名字,猜测是以工厂模式实现的。首先我们来看一下他的接口构成:
IHttpHandlerFactory
public interface IHttpHandlerFactory{
IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated);
void ReleaseHandler(IHttpHandler handler);
}
1、GetHandler(): 返回一个实现了IHttpHandler接口的实例。
2、ReleaseHandler():使得Factory可以重复使用一个已经存在Handler实例。
以上述ray,rss请求为例,实现Factory类:
public class HandlerFactory : IHttpHandlerFactory{
public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated){
IHttpHandler handler = null;
string path = context.Request.PhysicalPath;
switch(Path.GetExtension(path)){
case ".ray":
handler = new RayHandler();
break;
case ".rss":
handler = new RssHandler();
break;
default:
break;
}
return handler;
}
public void ReleaseHandler(IHttpHandler handler){
//void
}
}
这时,在Web.config中的配置如下:
<handlers>
<add name="test1" path="*.ray,*.rss" verb="*" type="WebApplication2.FactoryHandler,WebApplication2"/>
</handlers>
使用了IHttpHandlerFactory,那么我们的config文件的配置相对就简化了很多。
问题:
如果程序后续需要增加对新后缀的处理方法,就需要修改GetHandler()中的Switch语句,可能引发错误或带来其他安全隐患,这样做也违反了设计原则中的开放封闭原则。那么,如何才能够实现在后续扩展时,保持HandlerFactory类不变呢?
解决问题:
答案肯定是可以的。 熟悉设计模式的应该明白这里是一个简单工厂模式,要实现前面的功能我们用叫高级点的设计模式是可以实现的。
而在这里,我们还可以用C#语言的语言特性--反射。 通过C#的反射机制,我们根据URL的后缀来反射获取对应的Hanlder类型,只要我们将URL的后缀名跟Handler的类名约定一下对应关系即可。具体实现方式不在说明。
浅谈IHttpHandler的更多相关文章
- 【ASP.NET MVC系列】浅谈ASP.NET MVC 路由
ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...
- 浅谈 Fragment 生命周期
版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...
- 浅谈 LayoutInflater
浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...
- 浅谈Java的throw与throws
转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...
- 浅谈SQL注入风险 - 一个Login拿下Server
前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...
- 浅谈WebService的版本兼容性设计
在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...
- 浅谈angular2+ionic2
浅谈angular2+ionic2 前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别. 1. 项目所用:angular2+ionic2 ...
- iOS开发之浅谈MVVM的架构设计与团队协作
今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...
- Linux特殊符号浅谈
Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...
随机推荐
- c语言学习笔记(8)——函数
学完c语言的函数可以理解面向过程的语言 函数是c语言的重点 一.为什么需要函数? 1.避免了重复性操作 2.有利于程序的模块化(每一个功能可以用不同函数去实现) 二.什么叫做函数? 逻辑上:能够完成特 ...
- UWP 扩展/自定义标题栏的方法,一些概念和一些注意事项
原文 UWP 扩展/自定义标题栏的方法,一些概念和一些注意事项 在 Windows 10 的前几个版本中将页面内容扩展到标题栏上还算简单,主要是没什么坑.直到一些新控件的引入和一些外观设计趋势变化之后 ...
- Python: 文件操作与数据读取
文件及目录操作 python中对文件.文件夹(文件操作函数)的操作需要涉及到os模块,主要用到的几个函数是, import os 返回指定目录下的所有文件和目录名: os.listdir() 重命名: ...
- Maven环境下Poi的使用
Poi的使用方法,网上还是挺多的,官网也有教程. 附一个比较全的: http://www.cnblogs.com/vTree/archive/2011/11/30/2268721.html 需要说明的 ...
- ORACLE 时间加减操作
DATE和timestamp类型都可以进行加减操作.可以对当前日期加年.月.日.时.分.秒,操作不同的时间类型,有三种方法: 1 使用内置函数numtodsinterval增加小时,分钟和秒2 加一个 ...
- 利用FR导出PDF汉字乱码的处理
利用FR导出pdf,然后在unigui中显示,发现汉字乱码,改成gb2312,不乱码,但不自动折行,最后是改成DefaultCharSet搞定.FR版本:5.4.6 后记:有的浏览器中还是乱码,把字体 ...
- QTcpServer与QTcpSocket通讯
TCP TCP是一个基于流的协议.对于应用程序,数据表现为一个长长的流,而不是一个大大的平面文件.基于TCP的高层协议通常是基于行的或者基于块的. ●.基于行的协议把数 ...
- Android项目实战(一): SpannableString与SpannableStringBuilder
原文:Android项目实战(一): SpannableString与SpannableStringBuilder 前言: 曾经在一些APP中的一些类似“帮助”“关于”的界面看过一行文字显示不同的颜色 ...
- 理解 node.js 的事件循环
node.js 的第一个基本观点是,I/O 操作是昂贵的: 目前的编程技术最大的浪费来自等待 I/O 操作的完成.有几种方法可以解决这些对性能的影响(来自Sam Rushing): 同步:依次处理单个 ...
- VS2013环境里安装QT插件-“X86”与目标计算机类型“x64”冲突
在VS2013环境里搭载QT老是出现模块计算机类型“X86”与目标计算机类型“x64”冲突 2.解决方案2.1 项目右键,属性>配置管理选择>x64,没有的话新建:2.2 项目右键,属性 ...