老生常谈的话题,似乎每个人写这个类的时候同时也会写到另外一个HttpModule,不过偶突然想偷懒,只谈HttpHandler。
也许很多小菜没想过的一个问题,IIS是怎么处理HTTP中不同扩展名的文件的?
HttpHandler 其实就是处理对某种特定文件类型的请求,比如在.net中你可以处理.aspx的页面请求,从而使整个页面处理结果替换输出
在.net中,当一个http请求到达服务器时,IIS会跟据请求的文件扩展名判定由哪个应用程序处理请求,经过处理后发送给客户端(如果没有相应的处理程序,即会把文件不经过任何处理直接发送给客户商,另一个如果请求文件不存在即返回404错误),而这个处理app就是我们熟悉的ISAPI(在asp.net中就是aspnet_isapi.dll来执行这个操作)。
那么就很明白了,在IIS中,我们添加相应的文件扩展名映射给asp.net处理,就能处理对应的文件扩展名文件请求。当然,这个操作比较简单,这个不在本文讨论范围内。
好了,开始到了代码时间了,要创建HttpHandler,大家都知道必须是要实现IHttpHandler接口的类。
以官方例子:
public class HelloHttpHandler : IHttpHandler {
public bool IsReusable {
get { return true; }
}
public void ProcessRequest(HttpContext context) {
// do something
}
}
这里有IsReusable和ProcessReques方法要重写的.
ProcessReques方法就是我们处理请求并作出响应的方法,此方法同时传入当前请求的上下文HttpContext。
可以根据传入的上下文对象context去获取请求相关的对象信息。
IsReusable即大多数开发人员都会以“缓存”这个词去解释的,而根据官方资料是指示HttpHandler的实例能否被多个请求重用,或者说是否应该每次都创建一个新的实例。
然后,我身边的大部分朋友好像都只做过实现IHttpHandler,其实还有另他几个,也许比较常用的,其中一个选择是实现IHttpHandlerFactory接口处理(当然,还可以继承PageHandlerFactory类,
同样的原理)
好了,我们看下实现这个接口,我们可以看下相关的处理代码GetHandler方法在请求开始的时候被调用,
而ReleaseHandler却是在请求结束,所有的Handler都不再需要的时候被调用,一前一后。
因为如果明白了以上的两种处理方式的话,异步HTTP处理其实也是很容易了解的东西
public class YourHandlerFactory : IHttpHandlerFactory
{
public IHttpHandler
GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
{
throw new NotImplementedException();
}
public void ReleaseHandler(IHttpHandler handler)
{
throw new NotImplementedException();
}
}
当然,还可以实现IHttpAsyncHandler接口。顾名思义,很显然是就是异步IHttpAsyncHandler接口,
这里就不想太多的罗嗦了,官网也有相关的资料:
http://msdn.microsoft.com/zh-cn/library/ms227433%28v=VS.90%29.aspx
而web.config文件配置如下
< configuration >
< system.web >
< httpHndlers >
< add verb = " * " path = " *.aspx "
type = " YourHttpHandlerNameSpace.HandlerClassName, YourAssembly " />
</ httpHndlers >
</ system.web >
</ configuration >
这里罗嗦解释一下:
verb"*"表示对所有(get,post)请求进行处理。Path指明对相应的文件进行处理,
"*.aspx"表示会对ASPX页面的请求进行处理。还有一点,就是可以指明路径,如/handler/*.aspx
那么,我们就可以很方便地跟据一开始提的aspnet_isapi.dll工作方式,再结合HttpHandler的处理方面,
添加自定义的文件处理了,如可以添加path="*.abc"等自定义扩展名文件处理(当然,还需要在IIS应用程序配置中添加程序映影)
很显然,HttpHanlder是一种,怎么说呢?是不是可以说,其实就是半途截取断点处理的一种方式呢?
想替换的话,换HttpModule喽~~