HttpHandler

  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

web.config配置

 

2 设置ISAPI 

在IIS中设置ISAPI来进行文件与处理程序映射:

  1. 打开IIS,选择本范例所用的站点,右键,选择“属性”。
  2. 选择“主目录”选项卡,点击“配置...”按钮。
  3. 点击“添加”,设置“可执行文件”为“C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/aspnet_isapi.dll”,设置“扩展名”为“.foo”,点“确定”。
  4. 注意,不要勾选“检查文件是否存在”复选框,这样不用创建文件,只要在地址栏输入任意以.foo后缀结尾的文件名,均会交由上面创建的Handler去处理,而不管这个文件是否存在。

进行了这些设置以后,现在IIS就知道如何去处理对.foo后缀名文件的请求了。

使用

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分别设置。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值