妙用Asp.Net中的HttpHandler

例子1

很多时候,我们新建一个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,在中增加如下脚本:其中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 {

 /// /// 通过实现 IHttpHandler 接口的自定义 HttpHandler 启用 HTTP Web 请求的处理。 /// /// HttpContext 对象,它提供对用于为 HTTP 请求提供服务的内部服务器对象(如 Request、Response、Session 和 Server)的引用。

public void ProcessRequest (HttpContext context)

{

FormsAuthentication.SignOut();

context.Response.Redirect("Login.aspx",true);

} /// /// 获取一个值,该值指示其他请求是否可以使用 IHttpHandler 实例。 ///

public bool IsReusable

{

get { return false; }

}

}

}

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

例子2

最近在做政府门户时用最简单的方法实现了对url的改写成html格式,下面我把代码贴出来,供参考.
using System;
using System.Web;
using System.Web.Caching;
using System.Web.Security;
using System.Text.RegularExpressions;
using System.Web.SessionState;

namespace DXWeb
{
        /// <summary>
        /// URL 重写
        /// </summary>
        public class UrlReWrite : IHttpHandler ,IRequiresSessionState
        {
                /// <summary>
                /// 通过实现 IHttpHandler 接口的自定义 HttpHandler 启用 HTTP Web 请求的处理。
                /// </summary>
                /// <param name="context">HttpContext 对象,它提供对用于为 HTTP 请求提供服务的内部服务器对象(如 Request、Response、Session 和 Server)的引用。 </param>
                public void ProcessRequest(HttpContext Context)
                {
                        try
                        {
                                int type = 0;

                                string Url = Context.Request.Url.AbsolutePath;

                                Url = Url.Substring(Url.LastIndexOf("/") + 1,Url.Length - Url.LastIndexOf("/") - 1);
                                Url = Url.Substring(0,Url.IndexOf(".")).ToLower();

                                //如果第1位是f则指明是栏目页
                                if (Url.Substring(0,1) == "f")
                                {
                                        Url = Url.Substring(1,Url.Length - 1);
                                        type = 1;
                                }
                                else if (Url.Substring(0,1) == "n")//新闻
                                {
                                        Url = Url.Substring(1,Url.Length - 1);
                                        type = 2;
                                }
                                else if (Url.Substring(0,1) == "v")//视频
                                {
                                        Url = Url.Substring(1,Url.Length - 1);
                                        type = 3;
                                }
                                else if (Url.Substring(0,1) == "s")//网上办事
                                {
                                        Url = Url.Substring(1,Url.Length - 1);
                                        type = 4;
                                }
                                else if (Url.Substring(0,1) == "z")//办事指南
                                {
                                        Url = Url.Substring(1,Url.Length - 1);
                                        type = 5;
                                }

                                //检查文件名是否数字
                                if (Common.CheckInput(Url,"^[1-9][0-9]{0,9}$"))
                                {
                                        foreach (string key in Context.Request.QueryString.AllKeys)
                                                Url += "&" + key + "=" + Context.Request.QueryString[key];

                                        if (type == 1)
                                                Context.Server.Execute("Navigate.aspx?id=" + Url);
                                        else if (type == 2)
                                                Context.Server.Execute("News.aspx?id=" + Url);
                                        else if (type == 3)
                                                Context.Server.Execute("ShowVideo.aspx?id=" + Url);
                                        else if (type == 4)
                                                Context.Server.Execute("Service.aspx?id=" + Url);
                                        else if (type == 5)
                                                Context.Server.Execute("ShowService.aspx?id=" + Url);
                                }
                                else
                                {
                                        //否则查看硬盘是否有此文件


                                }
                               
                        }
                        catch// (Exception ex)
                        {
                                //Context.Response.Write(ex.Message);
                        }
                }

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

例子3

我们经常看到很多网站访问文章的时候才用的是***.html或***.shtml (如本blog的日志访问效果),其时这写文件在服务器上不存在的,那为什么会出现这样的效果呢,是因为Web服务器上对URL执行了重写,把访问的URL根据特定的格式重写成内部访问页面来实现的,它的好处是便于用户理解,同时搜索引擎也能更好地收入你的网站,当然其它的好处也很多,这里不做一一介绍了。

  本文所讲的是使用Asp.Net中的HttpHandler实现URL重写的,它所实现的原理请看这里,本程序可以处理任何Url,因为我在程序中使用了URL过虑,只有访问文件名是数字的才进行处理,并指在内部执行一个新的页面,并输出数据,代码如下:

public void ProcessRequest(HttpContext Context) 
{ 
    try { 
        //申明Request 
        HttpRequest Request = Context.Request; 
        //取来路Url的绝对路径 
        string Url = Request.Url.AbsolutePath; 
        //取访问的Web文件的开始字符间隔数 
        int RegStart = Url.LastIndexOf("/") + 1; 
        //申明一个确定Web文件名是否全是数字 
        Regex Reg = new Regex(@"/d+"); 
        //用正则表达式进行匹配 
        if (Reg.IsMatch(Url, RegStart)) 
        { 
            //如果web文件名是数字,则判定是查询相关文章,执行指定页面 
            Context.Server.Execute("~/PermaLink.aspx?id=" + Reg.Match(Url, RegStart).Value); 
        } 
    } catch { 
        Context.Response.Redirect(Context.Request.Url.ToString()); 
    } 
}

  当然你首先要做的是先建一个类,并继承自IHttpHandler,然后把这段代码拷入,并编译。在Web项目中若要使用此功能,需要在web.config里面加上如下语句:

<httpHandlers>
    <add verb="*" path="*.shtml" type="HttpHandle.UrlRewrite" />
</httpHandlers>

  同时,还要在IIS中对Web项目进行配置,在Web项目的属性中,在主目录选项卡里,把执行权限改为"脚本和可执行文件",然后打开配置,在应用程序扩展里加上需重写的文件格式的扩展,好了,成事具备,只欠运行了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值