在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的更多相关文章

  1. 【ASP.NET MVC系列】浅谈ASP.NET MVC 路由

    ASP.NET MVC系列文章 [01]浅谈Google Chrome浏览器(理论篇) [02]浅谈Google Chrome浏览器(操作篇)(上) [03]浅谈Google Chrome浏览器(操作 ...

  2. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  3. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  4. 浅谈Java的throw与throws

    转载:http://blog.csdn.net/luoweifu/article/details/10721543 我进行了一些加工,不是本人原创但比原博主要更完善~ 浅谈Java异常 以前虽然知道一 ...

  5. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  6. 浅谈WebService的版本兼容性设计

    在现在大型的项目或者软件开发中,一般都会有很多种终端, PC端比如Winform.WebForm,移动端,比如各种Native客户端(iOS, Android, WP),Html5等,我们要满足以上所 ...

  7. 浅谈angular2+ionic2

    浅谈angular2+ionic2   前言: 不要用angular的语法去写angular2,有人说二者就像Java和JavaScript的区别.   1. 项目所用:angular2+ionic2 ...

  8. iOS开发之浅谈MVVM的架构设计与团队协作

    今天写这篇博客是想达到抛砖引玉的作用,想与大家交流一下思想,相互学习,博文中有不足之处还望大家批评指正.本篇博客的内容沿袭以往博客的风格,也是以干货为主,偶尔扯扯咸蛋(哈哈~不好好工作又开始发表博客啦 ...

  9. Linux特殊符号浅谈

    Linux特殊字符浅谈 我们经常跟键盘上面那些特殊符号比如(?.!.~...)打交道,其实在Linux有其独特的含义,大致可以分为三类:Linux特殊符号.通配符.正则表达式. Linux特殊符号又可 ...

随机推荐

  1. 修复Windows 10 SDK 17763中NavigationView上的AcrylicBrush丢失

    原文 修复Windows 10 SDK 17763中NavigationView上的AcrylicBrush丢失 Microsoft发布了新版本的Windows 10 UWP SDK Build 17 ...

  2. 简明Python3教程 7.运算符和表达式

    简介 你写的大多数逻辑行都包含表达式.表达式的一个简单例子是2 + 3.一个表达式可分为操作符和操作数两部分. 操作符的功能是执行一项任务:操作符可由一个符号或关键字代表,如+ .操作符需要数据以供执 ...

  3. WPF中3D旋转的实现

    原文:WPF中3D旋转的实现 关于3D旋转的原理,请看Daniel Lehenbauer的文章 <Rotating the Camera with the Mouse> http://vi ...

  4. BS学习概述

    从最初的牛腩新闻公布系统,到如今的JS,回想一下,自己的BS也算是学了大半,可是有时候想起来还是总是有一种不踏实的感觉,一是由于从开学到如今赶上了三级考试,自考.软考,导致BS学习时间被大大压缩了,代 ...

  5. PYC文件简介

    PYC文件简介¶ 不说废话,这里说的pyc文件就是 Python 程序编译后得到的字节码文件 (py->pyc). 基本格式¶ pyc文件一般由3个部分组成: 最开始4个字节是一个Maigc i ...

  6. Go语言的网络功能太强了,这么多项目。。。

    Centrifugo 是一个用 Golang 实现的基于 Websocket 或者 SockJS 的实时通信平台.https://www.oschina.net/p/centrifugalrpcx是一 ...

  7. 微信小程序支付结果 c#后台回调

    又为大家带来简单的c#后台支付结果回调方法,首先还是要去微信官网下载模板(WxPayAPI),将模板(WxPayAPI)添加到服务器上,然后在打开WxPayAPI项目中的example文件下的 Nat ...

  8. 楼塔当天领袖acm心理(作为励志使用)

    楼主个人博客:吉尔博客 假期空闲的时候使用.这些年来GCJ.ACM,TopCoder 的一个号码的一重要的比赛的参与 回顾.GCJ2006 的回顾,今天时间上更早一些吧,我如今还清晰记得3 年 前.我 ...

  9. python_简单的DB统计

    import numpy as npimport pylab as pldates=['20170314','20170315','20170316','20170317','20170318','2 ...

  10. SQL Server查询当前连接数

    行数就是连接数,每一行是连接详情 SELECT * FROM [Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN ( SELECT [DBID] FROM [M ...