百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

asp.net开发:浅谈IHttpHandler www.tjydh.net/bmv10/index.asp?

yuyutoo 2024-10-26 16:12 3 浏览 0 评论

asp.net从webform发展到asp.net mvc,变化可谓巨大,我个人感觉asp.net mvc让web开发真正实现了前后端分离,用过mvc的小伙伴都知道,后端和前端交互的就是通过api接口,在mvc中定义API只需要定义一个控制器即可,微软为我们简化了定义Api的方式,但是我们也需要搞清楚背后的原理是什么?

在asp.net开发中,菜鸟到高手,绕不开就是asp.net的管道模型,这个是asp.net接管一个http请求的处理步骤。

我这里只对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的类名约定一下对应关系即可。具体实现方式不在说明。


努力,不是为了要感动谁,欢迎大家转发和关注。

相关推荐

史上最全的浏览器兼容性问题和解决方案

微信ID:WEB_wysj(点击关注)◎◎◎◎◎◎◎◎◎一┳═┻︻▄(页底留言开放,欢迎来吐槽)●●●...

平面设计基础知识_平面设计基础知识实验收获与总结
平面设计基础知识_平面设计基础知识实验收获与总结

CSS构造颜色,背景与图像1.使用span更好的控制文本中局部区域的文本:文本;2.使用display属性提供区块转变:display:inline(是内联的...

2025-02-21 16:01 yuyutoo

写作排版简单三步就行-工具篇_作文排版模板

和我们工作中日常word排版内部交流不同,这篇教程介绍的写作排版主要是用于“微信公众号、头条号”网络展示。写作展现的是我的思考,排版是让写作在网格上更好地展现。在写作上花费时间是有累积复利优势的,在排...

写一个2048的游戏_2048小游戏功能实现

1.创建HTML文件1.打开一个文本编辑器,例如Notepad++、SublimeText、VisualStudioCode等。2.将以下HTML代码复制并粘贴到文本编辑器中:html...

今天你穿“短袖”了吗?青岛最高23℃!接下来几天气温更刺激……

  最近的天气暖和得让很多小伙伴们喊“热”!!!  昨天的气温到底升得有多高呢?你家有没有榜上有名?...

CSS不规则卡片,纯CSS制作优惠券样式,CSS实现锯齿样式

之前也有写过CSS优惠券样式《CSS3径向渐变实现优惠券波浪造型》,这次再来温习一遍,并且将更为详细的讲解,从布局到具体样式说明,最后定义CSS变量,自定义主题颜色。布局...

柠檬科技肖勃飞:大数据风控助力信用社会建设

...

你的自我界限够强大吗?_你的自我界限够强大吗英文

我的结果:A、该设立新的界限...

行内元素与块级元素,以及区别_行内元素和块级元素有什么区别?

行内元素与块级元素首先,CSS规范规定,每个元素都有display属性,确定该元素的类型,每个元素都有默认的display值,分别为块级(block)、行内(inline)。块级元素:(以下列举比较常...

让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华
让“成都速度”跑得潇潇洒洒,地上地下共享轨交繁华

去年的两会期间,习近平总书记在参加人大会议四川代表团审议时,对治蜀兴川提出了明确要求,指明了前行方向,并带来了“祝四川人民的生活越来越安逸”的美好祝福。又是一年...

2025-02-21 16:00 yuyutoo

今年国家综合性消防救援队伍计划招录消防员15000名

记者24日从应急管理部获悉,国家综合性消防救援队伍2023年消防员招录工作已正式启动。今年共计划招录消防员15000名,其中高校应届毕业生5000名、退役士兵5000名、社会青年5000名。本次招录的...

一起盘点最新 Chrome v133 的5大主流特性 ?

1.CSS的高级attr()方法CSSattr()函数是CSSLevel5中用于检索DOM元素的属性值并将其用于CSS属性值,类似于var()函数替换自定义属性值的方式。...

竞走团体世锦赛5月太仓举行 世界冠军杨家玉担任形象大使

style="text-align:center;"data-mce-style="text-align:...

学物理能做什么?_学物理能做什么 卢昌海

作者:曹则贤中国科学院物理研究所原标题:《物理学:ASourceofPowerforMan》在2006年中央电视台《对话》栏目的某期节目中,主持人问过我一个的问题:“学物理的人,如果日后不...

你不知道的关于这只眯眼兔的6个小秘密
你不知道的关于这只眯眼兔的6个小秘密

在你们忙着给熊本君做表情包的时候,要知道,最先在网络上引起轰动的可是这只脸上只有两条缝的兔子——兔斯基。今年,它更是迎来了自己的10岁生日。①关于德艺双馨“老艺...

2025-02-21 16:00 yuyutoo

取消回复欢迎 发表评论: