HttpHandler概述
HttpHandler实际上是ISAPI扩展,负责处理http请求。HttpHandler是http请求的最底层,在该类中实现具体的请求响应。一个HttpHandler能且只能处理一种类型的文件或资源。
IIS根据配置可以将很多文件类型的请求都转发给aspnet_isapi.dll,而aspnet_isapi则根据asp.net framework配置文件中的文件影射,将不同的文件交给不同的处理程序。
HttpHandler类是实现了接口IHttpHandler的具体类。IHttpHandler接口定义了如果要实现一个HTTP请求的处理所必需实现的一些系统约定,它包含两个接口函数:
ProcessRequest:放置处理请求的实际代码
IsReusabel: 以后的请求是否可重用该实例
当一个HTTP请求经同HttpModule容器传递到HttpHandler容器中时,ASP.NET Framework会调用HttpHandler的PrecessRequest成员方法来对这个HTTP请求进行真正的处理。以一个ASPX页面为例,正是在这里一个ASPX页面才被系统处理解析,并将处理完成的结果继续经由HttpModule传递下去,直至到达客户端。
HttpHandler注册
asp.net有很多内置的HttpHandler,在web.config文件中查看<httphandlers/>节点:
要使HttpHandler可用,只要在应用程序的web.config文件中,按照以上方式进行相应的配置即可。
定制HttpHandler
也可以直接生成.ashx文件定义HttpHandler,方法是:Add New Item——〉Generic Handler,默认文件代码如下
使用定制的HttpHandler
1 web.config配置
2 设置ISAPI
在IIS中设置ISAPI来进行文件与处理程序映射:
- 打开IIS,选择本范例所用的站点,右键,选择“属性”。
- 选择“主目录”选项卡,点击“配置...”按钮。
- 点击“添加”,设置“可执行文件”为“C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll”,设置“扩展名”为“.foo”,点“确定”。
- 注意,不要勾选“检查文件是否存在”复选框,这样不用创建文件,只要在地址栏输入任意以.foo后缀结尾的文件名,均会交由上面创建的Handler去处理,而不管这个文件是否存在。
进行了这些设置以后,现在IIS就知道如何去处理对.foo后缀名文件的请求了。
3 使用
1)直接从浏览器上访问ashx页面:http://localhost:2694/WebSite2/ModuleAndHandler/MyHandler.ashx
2)编程访问: <img src=MyHandler.ashx />,也可以给ashx文件传递参数 <img src=MyHandler.ashx?id=12 />
3)在浏览器上请求*.foo文件:http://localhost:2694/WebSite2/ModuleAndHandler/a.foo
第1、2种请求方式需要创建ashx文件,而第3种是cs类文件
IHttpHandlerFactory
如果我们有很多个HttpHandler分别映射不同后缀名的请求,这样我们的Web.config会变得很冗长,或者,我们只有在程序运行时才能确切地知道使用哪个Handler,这个时候,可以考虑实现 IHttpHandlerFactory来完成这一过程。
实际上,ASP.NET Framework实际不直接将相关的页面资源HTTP请求定位到一个其内部默认的IHttpHandler容器之上,而定位到了其内部默认的IHttpHandlerFactory上。IHttpHandlerFactory的作用是对IHttpHandler容器进行调度和管理。
IHttpHandlerFactory接口包含两个函数
public interface IHttpHandlerFactory{
IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated);
void ReleaseHandler(IHttpHandler handler);
}
可见,需要实现两个方法,分别是 GetHandler() 和 ReleaseHandler()。
- GetHandler(),返回实现了IHttpHandler接口的类的实例。
- ReleaseHandler(),使得Factory可以重复使用一个已经存在的Handler实例。
例如,要定义两个Handler
这时,在Web.Config 中<system.web>节点下进行如下设置即可:
<httpHandlers>
<add path="*.rss,*.atom" type=" RssFeadsLib.HandlerFactory" verb="GET" />
</httpHandlers>
但是,这不能简化IIS中ISAPI的设置,还是需要手动去对.rss和.atom分别设置。