IHttpHandlerFactory IHttpHandlerx相关事宜
来源:互联网 发布:网络的坏处 编辑:程序博客网 时间:2024/05/01 18:41
.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都不再需要的时候被调用。
{
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 IHttpHandler GetHandler(HttpContext ctx,string requestType,string url,string pathTranslated)
{
//处理逻辑,最后返回一个HttpHandler类
}
public void ReleaseHandler(IHttpHandler handler) {}
}
前一步说过,一个
3:在Web.Config文件中注册这个HandlerFactory,注册的方式与HttpHandler是一样的。例:
<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类。- IHttpHandlerFactory IHttpHandlerx相关事宜
- 辞职相关事宜
- Activity启动相关事宜
- msm8909相关事宜
- 网站移植虚拟主机相关事宜
- nginx配置及其相关事宜
- 关于开发人员申请苹果账号相关事宜
- cocos2d-x配置Android项目相关事宜
- 省委短信平台调测相关事宜
- PlayMaker自定义action的相关事宜
- 北京理工大学研究生毕业答辩相关事宜
- Android中横竖屏相关事宜
- 支付宝快捷登录相关事宜
- 关于开发人员申请苹果账号相关事宜
- 关于开发人员申请苹果账号相关事宜
- 申请微信支付相关事宜
- xgboost模型部署及注意相关事宜。
- 《Drools 规则引擎视频教程》相关事宜
- ant 开发以及整合应用详解
- Ant Task:Ant任务(执行多个构件文件)
- 对象的初始化顺序问题02(继承中)
- 我放弃日语了吗?
- C语言标准库函数qsort排序的介绍与使用
- IHttpHandlerFactory IHttpHandlerx相关事宜
- Delphi中更改桌面图片的方法
- Linux网络截包不完全整理
- Delphi中获得任务栏以外的桌面大小
- Delphi中锁住计算机(关闭/重启计算机)
- Visual Studio 2010中文版下载链接
- 关于Nand Flash和Nor Flash的XIP
- VC编译 知识
- 使用windows live writer发布blog