在ASP.NET中实现简单的URL重写

    最近用ASP.NET写一个小网站程序,需要实现URL重写。在ASP.NET中实现URL重写算是一个古老的话题了,在微软的MSDN中也有文章专门讨论这个问题,文章地址为:
http://www.microsoft.com/china/msdn/library/webservices/asp.net/URLRewriting.mspx,在微软的解决方法中,开发人员需要自己编程实现HTTP模块和HTTP处理程序,此外还要修改配置文件,虽然不复杂,但也要写一些代码。我是一个喜欢偷懒的程序员,而且对ASP.NET编程不很熟悉,网站又小,因此我想出了一个简单方法来实现URL重写。
    首先看看URL重写的目的,URL重写的最终目标就是把难懂的充满"&?"符号的带参数的URL地址改变成自然的易于人类理解的结构简单的URL地址。可以认为所有能达到这种结果的手段就是URL重写。
    比如一个页面地址“http://server/customers.aspx?region=地区名称” ,它显示的是指定地区的客户列表,用户直接输入 "http://server/customers/地区名称"的样式,则经过URL重写,它转换为 "http://server/customers.aspx?region=地区名称",例如客户端为 "http://server/customers/东北.aspx",服务器端最终执行的是"customers.aspx?region=东北",URL重写使得WEB应用程序的URL人性化,提高程序的用户可用性。
    但符号"/"是一个特殊字符,可以解释为操作系统目录分隔符,URL重写时可能需要对此有所判断,我不想判断,于是没有"/"符号,而采用其他的重写方式,比如用户输入"http://server/东北客户.aspx",则重写为"customers.aspx?region=东北",这样重写方式简单,程序判断起来也容易。不需要编程实现HTTP模块,无需修改配置文件,实现了customers.aspx 后,只要在 Global.asax 中添加以下代码

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    
string name = base.Request.FilePath ;
    
if( name != null )
    {
        
int index = name.LastIndexOf('/');
        
if( index >= 0 )
            name 
= name.Substring( index + 1 );
        index 
= name.LastIndexOf('\\');
        
if( index >= 0 )
            name 
= name.Substring( index + 1 );
        index 
= name.LastIndexOf('.');
        
if( index >= 0 )
            name 
= name.Substring( 0 , index );
        name 
= name.Trim() ;
        
// 此处 name 就是请求地址的简单名称
        if( name.EndsWith("客户"))
        {
            name 
= name.Substring( 0 , name.Length - 2 );
            
base.Context.RewritePath( "customers.aspx?region=" + System.Web.HttpUtility.UrlEncode( name ) );
            
// 若使用 Response.Redirect 则会导致客户的IE地址栏输入的地址突变
            
//base.Context.RewritePath( "customers.aspx?region=" + name , true );
        }
    }
}

这种方法只使用了几十行代码就实现了简单的URL重写,无需实现各种接口,无需修改配置文件,实在是方便,我的懒惰的欲望得到了满足。

不过这是一种简单的URL重写方法,只能处理简单的问题,若需要实现复杂的URL重写,则还是推荐大家看看微软提出的URL重写方案。

在此提供一个实现简单URL重写的ASP.NET演示程序下载(/Files/xdesigner/URLRewriteDemo.rar) 。这个演示程序需要注意,对于ASP.NET,若URL参数中包含中文则可能出现问题,需要修改web.config 中的 globalization 元素的 requestEncoding 属性值为 "gb2312" ,但若使用URL重写则不存在这种问题。

袁永福(http://www.xdesigner.cn) 2007-3-28

原文地址:https://www.cnblogs.com/xdesigner/p/691497.html