HttpHandler实现url重定向

一,先在vs.net2005先新建个web site站点,我命名为RewriteTest,然后添加个404.aspx文件.  
二,修改iis.在iis中找到站点RewriteTest,右击选属性,在弹出的对话面板里面选,再点里面的404,选编辑属性,文件类型选url,下面输入:/RewriteTest/404.aspx  好了,点确定到头.在这里为什么我们不在web.config里面用<customErrors>来配置路径呢?因为在web.config里面设置的如果输入的是一个不存在的文件他能够截获,如果输入的是一个不存在的目录他就不能够截获拉,所以只能够在iis里面设置.  
三,我们现在修改web.config文件,让路径404.aspx来让我们的一个实现了IHttpHandler接口的类来处理他,修改如下:<system.web>  
    <httpHandlers>  
      <add verb="*" type="RewriteTest.Http404" path="404.aspx"/>  
    </httpHandlers>  
其中RewriteTest是名字空间,Http404是一个实现了IHttpHandler接口的类, 这样当我们的404.aspx截获到错误的时候会由这个Http404类来处理] 
四,我们添加个类Http404,代码如下,有详细的注释: 
using System; 
using System.Data; 
using System.Configuration; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 
using System.Web.UI.HtmlControls; 
namespace RewriteTest 

    /// <summary> 
    /// Summary description for Http404 
    /// </summary> 
    public class Http404:IHttpHandler 
    { 
        public Http404() 
        { 
            // 
            // TODO: Add constructor logic here 
            // 
        } 

        #region IHttpHandler Members 

        public bool IsReusable 
        { 
            get { throw new Exception("The method or operation is not implemented."); } 
        } 

        public void ProcessRequest(HttpContext context) 
        { 
            //throw new Exception("The method or operation is not implemented."); 
            string errorPath = context.Request.RawUrl.ToLower(); 
            context.Response.Write(errorPath); 
        } 

        #endregion 

        #region IHttpHandler Members 

        bool IHttpHandler.IsReusable 
        { 
            get { return false; } 
        } 

        void IHttpHandler.ProcessRequest(HttpContext context) 
        { 
            //首先我们取得请求的原始url,比如我们请求的是http://localhost/RewriteTest/123456 
            //RewriteTest是这个应用程序的名字,返回的将是/rewritetest/404.aspx?404;http://localhost/rewritetest/123456 
            //请大家注意404后面的; 
            string errorString = context.Request.RawUrl.ToLower(); 
            //context.Response.Write(errorString); 
            //再把得到的地址按照;分割下将得到结果是:http://localhost/rewritetest/123456 
            //这个时候我们再想办法得到那个不存在的虚拟目录 
            errorString = errorString.Split(';')[1]; 
            //也可以写成这样:errorString = errorString.Split(new char[]{';'})[1]; 
            //context.Response.Write(errorString); 
            //如果url含有点.我们就判断他带有后缀如.gif.jpg.asp.......我们就输出请求资源不存在的错误信息 
            if (errorString.IndexOf(".") < 0) 
            { 
                //去掉前面的http:// 
                errorString = errorString.Remove(0, 7); 
                //context.Response.Write(errorString); 
                //再得到域名 
                string hostName = context.Request.Url.Host; 
                errorString = errorString.Remove(0, hostName.Length); 
                //context.Response.Write(errorString); 
                //再得到请求的应用程序路径 
                string appPath = context.Request.ApplicationPath; 
                errorString = errorString.Remove(0, appPath.Length); 
                //context.Response.Write(errorString); 
                if (errorString.StartsWith("/")) 
                { 
                    //如果前面有/就去掉/ 
                    errorString = errorString.Remove(0, 1); 
                } 
                if (errorString.EndsWith("/")) 
                { 
                    //如果以/结尾我们也去掉他 
                    errorString = errorString.Remove(errorString.Length - 1, 1); 
                } 
                if (errorString.IndexOf("/") < 0) 
                { 
                    //如果中间含有/我们就不理他 
                    //好了,我们现在实现url重写,就是页面跳转,在这里我很奇怪为什么不能够用 
                    //context.RewritePath来实现,而要用Server.Transfer 
                    context.Server.Transfer("~/page.aspx?name=" + errorString); 
                } 
            } 
            else 
            { 
                context.Response.Write("懒MM.你请求的资源不存在,请点<a href='default.aspx'>这里</a>返回首页!"); 
            } 
        } 

        #endregion 
    } 

五,我们再添加个page.aspx文件,后台就一句代码: protected void Page_Load(object sender, EventArgs e) 
    { 
        Response.Write(Request.QueryString["name"].ToString()); 
    } 

转载自 http://www.myxici.com/board/d149489.htm

你可能感兴趣的:(handler)