HTTP 处理程序(HttpHandlers)

小结于MSDN: http://msdn.microsoft.com/zh-cn/library/ms228090(v=vs.80).aspx

在Http请求的处理过程中,可以通过framework提供的相应类和接口来对Http请求进行编程,主要有两个接口,一个是IHttpHandler,一个是IHttpModule,IHttpHandler处于整个请求处理过程的末端,新建的WebForm页继承自System.Web.UI.Page,而Page类则继承自IHttpHandler,也就是说对一个*.aspx文件的请求最终会交给一个IHttpHandler的实现类来处理,管它叫作页处理程序,它仅仅是一种类型的处理程序。ASP.NET还包括其他几种内置的处理程序,例如用于*.asmx文件的Web服务处理程序,以及*.ascx文件的用户控件处理程序等。

    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
         ////
        }
    }
    public class Page : TemplateControl, IHttpHandler
    {
      ///
    }

在应用程序生命周期中,IIS会把对ASP.NET相关资源的请求交给aspnet_isapi.dll去处理,然后aspnet_isapi.dll会根据请求资源的类型把请求交给相对应的HttpHandler去做进一步处理,这之间存在请求资源与处理程序(HttpHandler)的映射操作,打开C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config【这里是framework2目录下,framework4目录下也是一样的都在web.config中】,找到<httpHandlers>节点,就一目了然了,有所的内置处理程序的映射都已经在这里被设置好了。

有时候,这些内置的处理程序(HttpHandler)并不能满足我们功能需要,这时我们可以创建自定义HTTP处理程序。下面的方案就很好地利用了自定义HTTP处理程序:

(1)RSS源   
     若要为站点创建RSS源,可以创建一个可发出RSS格式XML的处理程序。然后将您应用程序中的.rss扩展名(举例)绑定到此自定义处理程序上。当用户向站点发送以.rss结尾的请求时,ASP.NET将调用您的处理程序来处理请求。

(2)图像服务器   
     如果希望 Web 应用程序能够提供不同大小的图像,可以编写一个自定义处理程序来调整图像大小,然后将调整后的图像作为处理程序的响应返回给用户。

HTTP 处理程序可以是同步的也可以是异步的。同步处理程序在完成对HTTP请求的处理后才会返回。异步处理程序运行进程的行为与向用户发送响应无关。当您需要启动一个可能耗费很长时间的应用程序进程,而用户又无需等候进程完成以便从服务器获取响应时,异步处理程序非常有用。

创建简单的同步HTTP处理程序
该处理程序对ASP.NET应用程序中其URL以.sample结尾的资源执行同步请求处理,此代码示例阐释了下列内容:
 
 (1)一个 HTTP 处理程序类的代码。该类必须实现 ProcessRequest 方法和 IsReusable 属性。
 
 (2)Web.config 文件中注册该处理程序并将 .sample 文件扩展名映射到该处理程序所需的元素。

当用户请求一个其URL以.sample结尾的资源时,Web服务器将该请求转发给ASP.NET。然后ASP.NET调用HTTP处理程序,后者返回一个响应。该响应由该处理程序动态创建;应用程序中不需要存在具有文件扩展名为.sample的文件

在VS中创建一个IHttpHandler的实现类有两种方法,在Add New Item面版上有两个Handler选择,一个是ASP.NET Handler选项,另一个是Generic Handler选项,可以分别选中,看看VS生成的代码有什么不同,可以发现基本上是一样的。

    public class HelloWorldHandler2 : IHttpHandler
    {
        public bool IsReusable
        {
            get { return false; }
        }

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            HttpResponse response = context.Response;
            response.Write("this is handler2 page!");
        }
    }

IsReusable属性:告诉ASP.NET此HttpHandler是否可以放在池中给下一个(或几个)请求继续使用,如果不可以,ASP.NET就会为每次请求使用一个新构造的IHttpHandler实例。

在自定义的HTTP处理程序写好之后,接下来要做的就是映射,得告诉ASP.NET,当我们发起对某类资源请求时它得使用哪个处理程序来进一步处理该请求,在IIS7中只要在Web.config 文件中注册自定义的HTTP处理程序就可以了,IIS6可以参考MSDN.

<configuration>
  <system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpHandlers>
      <add verb="*" path="*.sample" type="HttpHandlerTest.HelloWorldHandler,HttpHandlerTest"/>
  </system.web>
  <system.webServer>
   <validation validateIntegratedModeConfiguration="false"/>
    <handlers>
      <add name="aa" verb="*" path="*.sample" type="HttpHandlerTest.HelloWorldHandler,HttpHandlerTest"/>
    </handlers>
  </system.webServer>
</configuration>

为了兼容IIS6,在<system.web>和<system.webServer>结点中都要注册

verb指的是采用哪种HTTP方法(GET,PUT,POST等),verb="*"代表所有方法

path指定路径属性可以包含单个URL路径或简单的通配符字符串(如*.aspx)

type中的值以逗号分隔,前面是该处理程序所在的命名空间,后面是该处理程序所在的程序集名,不带.dll

测试自定义HTTP处理程序

在浏览器中,输入一个指向 Web 应用程序并以 .sample 结尾的 URL,如下所示:

http://localhost/HttpHandlerTest/test.sample

将显示:this is handler2 page!

原文地址:https://www.cnblogs.com/notebook2011/p/2880637.html