IHttpHandlerFactory IHttpHandlerx相关事宜

.net中不但可以在web.config中配置

      <add verb="POST,GET" path="login/default.aspx" type="Web.login.LoginHandler"/>

来进行单个handler的设置,也可以

     <add verb="POST,GET" path="do/default.aspx" type="Web.ProcessHandlerFactory"/>

来制定一个HttpHandlerFactory进行操作,当然,该factory需要提供接口来最终返回handler接口。

 

 

简单使用介绍:

 

妙用Asp.Net中的HttpHandler 
很多时候,我们新建一个xxx.aspx页和xxx.aspx.cs文件,不过是为了实现一个很简单的功能,如:输出xmlDom,注销并跳转,并没有什么html的输出,很是麻烦,需要新建一个页,删除多余的html,并在page_load里面写处理代码。而使用HttpHandler就不需要这么麻烦了。

可以用任何符合公共语言规范   (CLS)   的语言编写自定义   HTTP   处理程序来处理特定的、预定义类型的   HTTP   请求。响应这些特定请求的是在   HttpHandler   类中定义的可执行代码,而不是常规的   ASP   或   ASP.NET   Web   页。HTTP   处理程序向您提供一种方法,使您可以与   IIS   Web   服务器的低级别的请求和响应服务交互,同时提供极其类似于   ISAPI   扩展但编程模型较为简单的功能。

例如我现在需要实现一个注销并跳转的Logout.aspx页面,下面的示例主要实现了响应客户端对名为   logout.aspx   的页的请求,实现注销并跳转。对   logout.aspx   的所有请求均由包含在程序集   WebUC.dll   中的命名空间   WebUC.HttpHandler   中的   LogoutHttpHandler   提供服务。


修改web.config,在 <system.web> </system.web> 中增加如下脚本:
<httpHandlers>
  <add   verb= "GET "   path= "Logout.aspx "   type= "WebUC.HttpHandler.LogoutHttpHandler,   WebUC "   />
</httpHandlers>
其中WebUC.HttpHandler.LogoutHttpHandler是我要实现Logout.aspx功能的类,WebUC是我web项目的 dll。(具体介绍可以参阅msdn)

下面是LogoutHttpHandler的代码,继承借口,重写方法和属性。

using   System;
using   System.Web;
using   System.Web.Caching;
using   System.Web.Security;

namespace   WebUC.HttpHandler 
{

  public   class   LogoutHttpHandler   :   IHttpHandler 
  {
    ///   <summary>
    ///   通过实现   IHttpHandler   接口的自定义   HttpHandler   启用   HTTP   Web   请求的处理。
    ///   </summary>
    ///   <param   name= "context "> HttpContext   对象,它提供对用于为   HTTP   请求提供服务的内部服务器对象(如   Request、Response、Session   和   Server)的引用。   </param>
    public   void   ProcessRequest   (HttpContext   context) 
    {
      FormsAuthentication.SignOut();
      context.Response.Redirect( "Login.aspx ",true);
    }

    ///   <summary>
    ///   获取一个值,该值指示其他请求是否可以使用   IHttpHandler   实例。
    ///   </summary>
    public   bool   IsReusable 
    {
      get 
      {
        return   false;
      }
    }
  }

  }
}

编译后,我就可以直接使用http://***/logout.aspx   来实现注销了,而实际上,我的web目录下并没有logout.aspx这个文件,同样,这个技巧可以用在很多方面,例如防止盗链,下载统计等


 

妙用Asp.Net中的HttpHandler 
很多时候,我们新建一个xxx.aspx页和xxx.aspx.cs文件,不过是为了实现一个很简单的功能,如:输出xmlDom,注销并跳转,并没有什么html的输出,很是麻烦,需要新建一个页,删除多余的html,并在page_load里面写处理代码。而使用HttpHandler就不需要这么麻烦了。

可以用任何符合公共语言规范   (CLS)   的语言编写自定义   HTTP   处理程序来处理特定的、预定义类型的   HTTP   请求。响应这些特定请求的是在   HttpHandler   类中定义的可执行代码,而不是常规的   ASP   或   ASP.NET   Web   页。HTTP   处理程序向您提供一种方法,使您可以与   IIS   Web   服务器的低级别的请求和响应服务交互,同时提供极其类似于   ISAPI   扩展但编程模型较为简单的功能。

例如我现在需要实现一个注销并跳转的Logout.aspx页面,下面的示例主要实现了响应客户端对名为   logout.aspx   的页的请求,实现注销并跳转。对   logout.aspx   的所有请求均由包含在程序集   WebUC.dll   中的命名空间   WebUC.HttpHandler   中的   LogoutHttpHandler   提供服务。


修改web.config,在 <system.web> </system.web> 中增加如下脚本:
<httpHandlers>
  <add   verb= "GET "   path= "Logout.aspx "   type= "WebUC.HttpHandler.LogoutHttpHandler,   WebUC "   />
</httpHandlers>
其中WebUC.HttpHandler.LogoutHttpHandler是我要实现Logout.aspx功能的类,WebUC是我web项目的 dll。(具体介绍可以参阅msdn)

下面是LogoutHttpHandler的代码,继承借口,重写方法和属性。

using   System;
using   System.Web;
using   System.Web.Caching;
using   System.Web.Security;

namespace   WebUC.HttpHandler 
{

  public   class   LogoutHttpHandler   :   IHttpHandler 
  {
    ///   <summary>
    ///   通过实现   IHttpHandler   接口的自定义   HttpHandler   启用   HTTP   Web   请求的处理。
    ///   </summary>
    ///   <param   name= "context "> HttpContext   对象,它提供对用于为   HTTP   请求提供服务的内部服务器对象(如   Request、Response、Session   和   Server)的引用。   </param>
    public   void   ProcessRequest   (HttpContext   context) 
    {
      FormsAuthentication.SignOut();
      context.Response.Redirect( "Login.aspx ",true);
    }

    ///   <summary>
    ///   获取一个值,该值指示其他请求是否可以使用   IHttpHandler   实例。
    ///   </summary>
    public   bool   IsReusable 
    {
      get 
      {
        return   false;
      }
    }
  }

  }
}

编译后,我就可以直接使用http://***/logout.aspx   来实现注销了,而实际上,我的web目录下并没有logout.aspx这个文件,同样,这个技巧可以用在很多方面,例如防止盗链,下载统计等

 

IHttpHandlerFactory处理Http请求的用法

如果你了解 Factory 设计模式,这篇文章可以不用看,只要会配置 IHttpHandlerFactory 就 可以,不了解也没有关系,通过下面的文章你可以学会如何使用 IHttpHandlerFactory , 同时还会明白 Factory 设计模式的广义定义

在前一篇专题中讲解了 HttpHandler 在 CS 中 的运用以及一些相关的话题。其实实现 HttpHandler 功能还有另外一个选择就是 Handler Factory(CS 中没有用到Handler Factory ) ,这是通过继承 IHttpHandlerFactory 接 口来实现的。

IHttpHandlerFactory 接 口的定义如下: 2 个方法, GetHandler 方 法在请求开始的时候被调用,而 ReleaseHandler 在请求结束,所有的 Handler 都 不再需要的时候被调用。

interface IHttpHandlerFactory

{

IHttpHandler GetHandler(HttpContext ctx,
string requestType, string url, string pathTranslated);

void ReleaseHandler(IHttpHandler handler);

}

该接口中定义了

如何使用呢?大致有三个步骤:

1 :定义实 际处理 HttpHandler 的类 ( 实现 IHttpHandler 接 口 ) ,这个类会在 HandlerFactory 中 被调用以进行业务处理,一个 HandlerFactory 可以调用 N 个 HttpHandler 类 (不然就不叫 Factory 不是!)进行处理相关的业务逻辑。

2 :定义 HandlerFactory , 例:

public class MyHandlerFactory : IHttpHandlerFactory

{

public IHttpHandler GetHandler(HttpContext ctx, string requestType, string url, string pathTranslated)

{

//处理逻辑,最后返回一个HttpHandler类

}


public void ReleaseHandler(IHttpHandler handler) {}

}

前一步说过,一个

3 :在 Web.Config 文 件中注册这个 HandlerFactory ,注册的方式与 HttpHandler 是 一样的。例:

< httpHandlers >

< add verb ="*" path ="*.*"

type
="MyNamespace. MyHandlerFactory, MyAssembly" />

</ httpHandlers >

注意,这里不要再对

IHttpHandlerFactory 其 实非常简单,存在的思想就是 Factory 设计模式 (Factory 模 式:利用给 Factory 对象传递不同的参数,以返回具有相同基类或实现了同一接口的对象 , 这 里指返回具有同一 IHttpHandler 接口的对象 ) 。

什么时候你要使用 IHttpHandlerFactory 而 不去使用 IHttpHandler ,我就个人的开发经验做一下总结:

1 : 在一个项目中需要使用很多 IHttpHandler 的时候,而且对这些 IHttpHandler 判 断都重复做一个同样的前期处理,如果防盗链的例子中对图片和压缩两个不同 HttpHandler 的 处理,但是他们对 URL 的判断都是一致的,在 .Text 中 使用了 IHttpHandlerFactory ,而不是 IHttpHandler , 对于 URL 的请求全都 (*.asmx 、 Error.aspx 除 外 ) 转交由一个 IHttpHandlerFactory 入 口统一处理。

2 : 从部署和松散耦合考虑,如果你的 web application 足够大 ( 我 目前还没有设计过这种大型 app) ,你就要考虑在更换 HttpHandler 处 理类的时候该不该去改动 Web.config 的配置,这种改动将会重新启动整个 app , 对于一些系统而言这是不可以随便进行的。这个时候,统一一个入口的 IHttpHandlerFactory 很 重要,这个入口相对不变,而 IHttpHandler 实现可以通过外挂自定义的 xml 文 件来实现松散耦合,运用一些反射什么的就可以实现了。

如果对 IHttpHandlerFactory 有 其他见解的朋友请留下你的观点。

HttpHandler 进行配置了,无论你定义了多少 IHttpHandler 实 例,只要他们是通过 HttpHandlerFactory 调用实现其功能,在这里都不要去注册它, 不然就重复了。 HandlerFactory 可以处理 N 个 HttpHandler , 什么时候该处理什么 HttpHandler 就在这里的处理逻辑中实现,例如:以上一篇专题防盗链中 说到的,你可以定义两个 IHttpHandler 实现,分别处理对图片与压缩文件的请求。由于 GetHandler 方 法中传入了 HttpContext 的上下文,因此可以对上下文中的 Url 请 求进行判断,然后启用不同的 HttpHandler 类。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值