好记忆不如烂博客.记HttpHandler
很多时候,我们新建一个xxx.aspx页和xxx.aspx.cs文件,不过是为了实现一个很简单的功能,如:输出 "修改成功"什么的,注销并跳转,并没有什么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,在 中增加如下脚本: 其中WebUC.HttpHandler.LogoutHttpHandler是我要实现Logout.aspx功能的类,WebUC是我web项目的dll。
(具体介绍可以参阅msdn) 下面是LogoutHttpHandler的代码,继承借口,重写方法和属性。
修改web.config,在
(具体介绍可以参阅msdn) 下面是LogoutHttpHandler的代码,继承借口,重写方法和属性。
代码
编译后,我就可以直接使用http://***/logout.aspx 来实现注销了,而实际上,我的web目录下并没有logout.aspx这个文件,同样,这个技巧可以用在很多方面,例如防止盗链,下载统计等。
1 using System;
2 using System.Web;
3 using System.Web.Caching;
4 using System.Web.Security;
5
6 namespace WebUC.HttpHandler
7 {
8
9 public class LogoutHttpHandler : IHttpHandler
10 {
11 /// <summary>
12 /// 通过实现 IHttpHandler 接口的自定义 HttpHandler 启用 HTTP Web 请求的处理。
13 /// </summary>
14 /// <param name="context">HttpContext 对象,它提供对用于为 HTTP 请求提供服务的内部服务器对象(如 Request、Response、Session 和 Server)的引用。 </param>
15 public void ProcessRequest (HttpContext context)
16 {
17 FormsAuthentication.SignOut();
18 context.Response.Redirect("Login.aspx",true);
19 }
20
21 /// <summary>
22 /// 获取一个值,该值指示其他请求是否可以使用 IHttpHandler 实例。
23 /// </summary>
24 public bool IsReusable
25 {
26 get
27 {
28 return false;
29 }
30 }
31 }
32
33 }
34 }
35
36
2 using System.Web;
3 using System.Web.Caching;
4 using System.Web.Security;
5
6 namespace WebUC.HttpHandler
7 {
8
9 public class LogoutHttpHandler : IHttpHandler
10 {
11 /// <summary>
12 /// 通过实现 IHttpHandler 接口的自定义 HttpHandler 启用 HTTP Web 请求的处理。
13 /// </summary>
14 /// <param name="context">HttpContext 对象,它提供对用于为 HTTP 请求提供服务的内部服务器对象(如 Request、Response、Session 和 Server)的引用。 </param>
15 public void ProcessRequest (HttpContext context)
16 {
17 FormsAuthentication.SignOut();
18 context.Response.Redirect("Login.aspx",true);
19 }
20
21 /// <summary>
22 /// 获取一个值,该值指示其他请求是否可以使用 IHttpHandler 实例。
23 /// </summary>
24 public bool IsReusable
25 {
26 get
27 {
28 return false;
29 }
30 }
31 }
32
33 }
34 }
35
36
ASP.NET中的Http Handles
一、关于http handles
ASP.NET的请求过程是基于一个管道(pipeline)模型的,ASP.NET会把所有的http请求(Requests)都发送给这个管道里的http组件(modules)。每个组件在接收到http请求后进行一些相应的动作。当http请求通过了所有的http modules程序后,将会被交由一个http handle程序来处理,处理后的结果又将通过管道里http modules返回。这整个过程中,被调用的http module可以有多个,然而调用的http handle只能是一个