HttpHandler工作原理

HttpHandler是一个HTTP请求的真正处理中心,也正是在这个HttpHandler容器中,ASP.NET Framework才真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中。

 IHttpHandler是什么

IHttpHandler定义了如果要实现一个HTTP请求的处理所必需实现的一些系统约定。HttpHandlerHttpModule不同,一旦定义了自己的HttpHandler类,那么它对系统的HttpHandler的关系将是“覆盖”关系。

 IHttpHandler如何处理HTTP请求

当一个HTTP请求经同HttpModule容器传递到HttpHandler容器中时,ASP.NET Framework会调用HttpHandlerProcessRequest成员方法来对这个HTTP请求进行真正的处理。以一个ASPX页面为例,正是在这里一个ASPX页面才被系统处理解析,并将处理完成的结果继续经由HttpModule传递下去,直至到达客户端。

对于ASPX页面,ASP.NET Framework在默认情况下是交给System.Web.UI.PageHandlerFactory这个HttpHandlerFactory来处理的。所谓一个HttpHandlerFactory,所谓一个HttpHandlerFactory,是指当一个HTTP请求到达这个HttpHandler Factory时,HttpHandlerFactory会提供出一个HttpHandler容器,交由这个HttpHandler容器来处理这个HTTP请求。

一个HTTP请求都是最终交给一个HttpHandler容器中的ProcessRequest方法来处理的。

 


1ProcessRequest方法

 一个简单的HttpHandler容器

通过实现IHttpHandler接口可以创建自定义HTTP处理程序,该接口只包含两个方法。通过调用IsReusableIHttpHandlerFactory可以查询处理程序以确定是否可以使用同一实例为多个请求提供服务。ProcessRequest方法将HttpContext实例用作参数,这使它能够访问RequestResponse内部对象。在一个HttpHandler容器中如果需要访问Session,必须实现IRequiresSessionState接口,这只是一个标记接口,没有任何方法。


示例
1

using System;

using System.Collections.Generic;

using System.Text;

using System.Web;

using System.Web.SessionState;

 

namespace MyHandler

{

    /// <summary>

    /// 目的:实现一个简单的自定义HttpHandler容器

    /// 作者:文野

    /// 联系:stwyhm@cnblogs.com

    /// </summary>

    public class MyFirstHandler : IHttpHandler,IRequiresSessionState

    {

        #region IHttpHandler 成员

 

        public bool IsReusable

        {

            get { return true; }

        }

 

        public void ProcessRequest(HttpContext context)

        {

            context.Response.Write("<h1><b>Hello HttpHandler</b></h1>");

            context.Session["Test"] = "测试HttpHandler容器中调用Session";

            context.Response.Write(context.Session["Test"]);

        }

         #endregion

    }

}

Web.config中加入如下配置:

<httpHandlers>

     <add verb="*" path="*" type="MyHandler.MyFirstHandler, MyHandler"/>

</httpHandlers>

 


 

IHttpHandler工厂

ASP.NET Framework实际不直接将相关的页面资源HTTP请求定位到一个其内部默认的IHttpHandler容器之上,而定位到了其内部默认的IHttpHandler工厂上。IHttpHandler工厂的作用是对IHttpHandler容器进行调度和管理。

IHttpHandlerFactory接口包含两个方法。GetHandler返回实现IHttpHandler接口的类的实例,ReleaseHandler使工厂可以重用现有的处理程序实例。

 

示例2

 1  using  System;
 2  using  System.Collections.Generic;
 3  using  System.Text;
 4  using  System.Web;
 5 
 6  namespace  MyHandler
 7  {
 8       public   class  MyHandlerFactory : IHttpHandlerFactory
 9      {
10           #region  IHttpHandlerFactory 成员
11 
12            public  IHttpHandler GetHandler(HttpContext context,  string  requestType,  string  url,  string  pathTranslated)
13          {
14               string  fname  =  url.Substring(url.IndexOf( ' / ' +   1 );
15               while  (fname.IndexOf( ' / ' !=   - 1 )
16                  fname  =  fname.Substring(fname.IndexOf( ' / ' +   1 );
17               string  cname  =  fname.Substring( 0 , fname.IndexOf( ' . ' ));
18               string  className  =   " MyHandler. "   +  cname;
19               object  h  =   null ;
20               try
21              {
22                 //  采用动态反射机制创建相应的IHttpHandler实现类。
23                  h  =  Activator.CreateInstance(Type.GetType(className));
24              }
25               catch  (Exception e)
26              {
27                   throw   new  HttpException( " 工厂不能为类型 " + cname + " 创建实例。 " ,e);
28              }
29               return  (IHttpHandler)h;
30          }
31   
32           public   void  ReleaseHandler(IHttpHandler handler)
33          {
34              
35          }
36 
37           #endregion
38      }
39 
40       public   class  Handler1 : IHttpHandler
41      {
42          #region  IHttpHandler 成员
43   
44           public   bool  IsReusable
45         {
46              get  {  return   true ; }
47         }
48   
49           public   void  ProcessRequest(HttpContext context)
50          {
51              context.Response.Write( " <html><body><h1>来自Handler1的信息。</h1></body></html> " );
52          }
53   
54           #endregion
55      }
56   
57      public   class  Handler2 : IHttpHandler
58     {
59         #region  IHttpHandler 成员
60 
61          public   bool  IsReusable
62        {
63            get  {  return   true ; }
64        }
65 
66         public   void  ProcessRequest(HttpContext context)
67        {
68           context.Response.Write( " <html><body><h1>来自Handler2的信息。</h1></body></html> " );
69        }
70 
71         #endregion
72      }
73  }
74 
75 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值