浅谈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特殊符号又可 ...
随机推荐
- win10下Linux子系统开启ssh服务
原文:win10下Linux子系统开启ssh服务 为了便于交流共同学习,博主QQ群242629020(stm32-MCU认认真真交流群) 欢迎批评指导!!!电梯:https://jq.qq.com/? ...
- 3DTools TrackballDecorator实现3D漫游
原文:3DTools TrackballDecorator实现3D漫游 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/m0_37591671/art ...
- 带农历日历的DatePicker控件!Xamarin控件开发小记
原文:带农历日历的DatePicker控件!Xamarin控件开发小记 闲来无事开发了个日期选择控件,感兴趣的同学前往: https://github.com/MatoApps/Mato.DatePi ...
- 一款天气app的温度曲线图的实现
原文:一款天气app的温度曲线图的实现 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/tyhzsd/article/details/50544639 ...
- Lexer的设计--中(4)
设计一个小型的内存池以及链表 上一节撸到万事俱备只欠真正的lex, 但是lex的作用是将源代码转化为Token流, 用什么保存Token? 这就涉及到我们要接触的第一个数据结构-链表, 虽然标准库中很 ...
- ASP UserInfoList 方法1
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="UserInfoList.a ...
- C/C++ static用法
这篇文章没有太多的实际内容,简单记录下static的用法.顺便试一下用markdown来写文章. 1. 在函数中使用 我们都知道在一个函数中的变量是存储在栈区中,函数的每一次调用都伴随着变量的重新定义 ...
- inno setup 打包说明
[Setup] 这个段包含用于安装程序和卸载程序的全局设置 AppId:在注册表中唯一的项名称,安装完64位系统在 HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\M ...
- gcc/g++编译(生动形象,从最容易入手的hello world解释了库的概念)
1. gcc/g++在执行编译工作的时候,总共需要4步 (1).预处理,生成.i的文件[预处理器cpp] (2).将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs] (3).有汇编变为目 ...
- C++成员函数指针错误用法警示(成员函数指针与高性能的C++委托,三篇),附好多评论
今天做一个成绩管理系统的并发引擎,用Qt做的,仿照QtConcurrent搞了个模板基类.这里为了隐藏细节,隔离变化,把并发的东西全部包含在模板基类中.子类只需注册需要并发执行的入口函数即可在单独线程 ...