不用组件的url重写(适用于较大型项目)-阿里云开发者社区

开发者社区> xland> 正文

不用组件的url重写(适用于较大型项目)

简介: 网上很多关于url重写的教程都推荐下载某某某组件, 我个人不喜欢这样,即使是M$的组件也一样,因为我们干程序员的,越贴近真相越好 那么我也写一个关于url重写的文章,希望对和我一样有个性的coder们有点帮助   先在网站根目录下建立一个config文件夹,再在此文件架下建立一个urls.
+关注继续查看


网上很多关于url重写的教程都推荐下载某某某组件,

我个人不喜欢这样,即使是M$的组件也一样,因为我们干程序员的,越贴近真相越好

那么我也写一个关于url重写的文章,希望对和我一样有个性的coder们有点帮助

 

先在网站根目录下建立一个config文件夹,再在此文件架下建立一个urls.config文件,这里记录url的配置信息代码如下

img_1c53668bcee393edac0d7b3b3daff1ae.gifimg_405b18b4b6584ae338e0f6ecaf736533.gifCode
<?xml version="1.0" encoding="utf-8"?>
<urls>
  
<rewrite name="default"
      path
="/default-{0}-{1}.aspx"
      pattern 
= "/default-(\d+)(-(\d+))?.aspx"
      page
="/default.aspx"
      querystring
="id=$1^page=$3" />
</urls>

 我这里只写了一种规则

 

然后修改网站的web.config文件,修改后的代码为

img_1c53668bcee393edac0d7b3b3daff1ae.gifimg_405b18b4b6584ae338e0f6ecaf736533.gifCode
<?xml version="1.0"?>
<configuration>
    
<appSettings/>
    
<connectionStrings/>
    
<system.web>
        
<authentication mode="Windows"/>
        
<httpModules>
            
<add type="my.Forum.HttpModule" name="HttpModule"/>
        
</httpModules>
        
<compilation debug="true"/></system.web>
    
<!-- 
        在 Internet 信息服务 7.0 下运行 ASP.NET AJAX 需要 system.webServer
        节。对早期版本的 IIS 来说则不需要此节。
    
-->
    
<system.webServer>
        
<validation validateIntegratedModeConfiguration="false"/>
        
<modules>
            
<add type="my.Forum.HttpModule" name="HttpModule"/>
        
</modules>
    
</system.webServer>
</configuration>

本来只写一个

<httpModules>
     
<add type="my.Forum.HttpModule" name="HttpModule"/>
</httpModules>

就可以了,我这里写了两个主要是为了演示如何兼容IIS7

 

然后在解决方案下新建一个项目(类库),起什么名字无所谓,主要是这个项目下一定要有一个命名空间为my.Forum的类文件

具体代码我贴出来   详细的解释我都写在注释里了

 

img_1c53668bcee393edac0d7b3b3daff1ae.gifimg_405b18b4b6584ae338e0f6ecaf736533.gifCode
//用到的命名空间
using System;
using System.Diagnostics;
using System.Threading;
using System.Web;
using System.Xml;
using System.Text.RegularExpressions;
using System.IO;

//注意名称空间
namespace my.Forum
img_405b18b4b6584ae338e0f6ecaf736533.gifimg_1c53668bcee393edac0d7b3b3daff1ae.gif
{
    
//继承自IHttpModule接口
    public class HttpModule : System.Web.IHttpModule
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    
{
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 实现接口的Init方法
        
/// </summary>
        
/// <param name="context"></param>

        public void Init(HttpApplication context)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
            
//建立个委托让他执行下面的ReUrl_BeginRequest事件
            context.BeginRequest += new EventHandler(ReUrl_BeginRequest);
        }

img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
/**//// <summary>
        
/// 实现接口的Dispose方法
        
/// </summary>

        public void Dispose()
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
        }

        
private void ReUrl_BeginRequest(object sender, EventArgs e)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
            HttpContext context 
= ((HttpApplication)sender).Context;
            
string requestPath = context.Request.Path.ToLower();
            
//SiteUrls是下面的一个类,这里大家可以重构下
            foreach (SiteUrls.URLRewrite url in SiteUrls.GetSiteUrls().Urls)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                
//是否找到了匹配选项
                if (Regex.IsMatch(requestPath, url.Pattern, RegexOptions.None | RegexOptions.IgnoreCase))
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                
{
                    
//开始替换成我们程序能读懂的url
                    string newUrl = Regex.Replace(requestPath.Substring(context.Request.Path.LastIndexOf("/")), url.Pattern, url.QueryString, RegexOptions.None | RegexOptions.IgnoreCase);
                    
//这里你可以输出一下看看
                    
//context.Response.Write(url.Page + "<br>" + newUrl+"<br>");
                    
//开始把用户便于记忆的URL替换成程序能读懂的url
                    context.RewritePath(url.Page, string.Empty, newUrl);
                }

            }

        }

    }

    
public class SiteUrls
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif    
{
        
//定义成volatitle类型主要是为了多线程访问方便,在这个示例程序中没什么实际意义,项目大了就有用了
        private static volatile SiteUrls instance = null;
        
string UrlsFile = HttpContext.Current.Server.MapPath("/config/urls.config");
        
//定义两个属性
        private System.Collections.ArrayList _Urls;
        
public System.Collections.ArrayList Urls
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
get return _Urls; }
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
set { _Urls = value; }
        }

        
//这个就是个键植对 表害怕一点也不高深
        private System.Collections.Specialized.NameValueCollection _Paths;
        
public System.Collections.Specialized.NameValueCollection Paths
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
get return _Paths; }
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
set { _Paths = value; }
        }

        
//构造函数
        private SiteUrls()
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
            Urls 
= new System.Collections.ArrayList();            
            Paths 
= new System.Collections.Specialized.NameValueCollection();
            
//以XML个数读取那CONFIG文件
            XmlDocument urlconfig = new XmlDocument();
            urlconfig.Load(UrlsFile);
            XmlNode root 
= urlconfig.SelectSingleNode("urls");
            
foreach (XmlNode n in root.ChildNodes)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                
//XmlNodeType.Comment如果不是注释
                if (n.NodeType != XmlNodeType.Comment && n.Name.ToLower() == "rewrite")
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                
{
                    XmlAttribute name 
= n.Attributes["name"];
                    XmlAttribute path 
= n.Attributes["path"];
                    XmlAttribute page 
= n.Attributes["page"];
                    XmlAttribute querystring 
= n.Attributes["querystring"];
                    XmlAttribute pattern 
= n.Attributes["pattern"];

                    
if (name != null && path != null && page != null && querystring != null && pattern != null)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                    
{
                        Paths.Add(name.Value, path.Value);
                        
//压进去的都是url实体类
                        Urls.Add(new URLRewrite(name.Value, pattern.Value, page.Value.Replace("^""&"), querystring.Value.Replace("^""&")));
                    }

                }

            }

        }

        
//用方法实例化
        public static SiteUrls GetSiteUrls()
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
            
if (instance == null)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                instance 
= new SiteUrls();
            }

            
return instance;
        }

img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif        
url实体类#region url实体类
        
public class URLRewrite
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif        
{
img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif            
成员变量#region 成员变量
            
private string _Name;
            
public string Name
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                
get
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                
{
                    
return _Name;
                }

                
set
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                
{
                    _Name 
= value;
                }

            }


            
private string _Pattern;
            
public string Pattern
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                
get
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                
{
                    
return _Pattern;
                }

                
set
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                
{
                    _Pattern 
= value;
                }

            }


            
private string _Page;
            
public string Page
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                
get
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                
{
                    
return _Page;
                }

                
set
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                
{
                    _Page 
= value;
                }

            }


            
private string _QueryString;
            
public string QueryString
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                
get
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                
{
                    
return _QueryString;
                }

                
set
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif                
{
                    _QueryString 
= value;
                }

            }

            
#endregion


img_7a2b9a960ee9a98bfd25d306d55009f8.gifimg_2887d91d0594ef8793c1db92b8a1d545.gif            
构造函数#region 构造函数
            
public URLRewrite(string name, string pattern, string page, string querystring)
img_2887d91d0594ef8793c1db92b8a1d545.gifimg_7a2b9a960ee9a98bfd25d306d55009f8.gif            
{
                _Name 
= name;
                _Pattern 
= pattern;
                _Page 
= page;
                _QueryString 
= querystring;
            }

            
#endregion

        }

        
#endregion

    }

}

 

文章写到这里就完了,

现在访问http://localhost/Default-1-1.aspx就可以接收到id为1  page为1的参数了

具体的规则可以自己设置

我已经把示例文件传到网上了可以点这里下载

本文参考了discuz的代码

补充在类SiteUrls中用到了单件模式(设计模式)因为此文不是谈设计模式,这里就不细说了

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
《圣殿祭司的ASP.NET4.0专家技术手册》---- 1-14 项目同时使用C# 与VB语言及多组件的技巧
早期VS.NET 2002及VS.NET 2003的Visual Studio工具不支持多个组件文件(Assembly),也就是项目编译后只会产生一个dll组件,而一个组件只允许包含一种语言(因为系统会调用对应C#或VB编译程序进行编译),因此在同一个项目中要使用两种语言是办不到的;但在VS 2010中,因为项目支持多个组件,所以利用这个特性就可以同时使用两种以上的语言(如C#与VB),因此.cs或.vb的类别在项目中就可以直接拿来使用,直接就可以new instance,不需要先编译成dll文件再加以引用。
1418 0
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
9485 0
C++第13周项目4——多文件组织回文、素数
课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 【项目4-多文件程序组织】  按《C++程序设计题解与上机指导》P226第15.4节的提示,建立一个包含多个文件的项目,将第12周“项目4-回文、素数”中所做工作用多文件组织起来。其中,main()函数保存在一个文件中,所有自定义函数保存到另外一个文件中,运行程序并得
974 0
C++第13周项目5——银行系统多文件组织(v0.31)
课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 说明:此项目是为未学习数组的同学拟出的,目的是让他们对“工程”有所体验。一些实现并不是最佳的,请参考后续的题目 【项目5-银行系统】 (4)将程序用多文件组织  涉及密码、帐户的函数放在一个文件中,完成各项功能的函数放在另一个文件中,main函放也单独一个文件。这种
1084 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
13168 0
C++第13周项目5——银行系统多文件组织+包含文件(v0.32)
课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565 说明:此项目是为未学习数组的同学拟出的,目的是让他们对“工程”有所体验。一些实现并不是最佳的,请参考后续的题目 【项目5-银行系统】 (4)将程序用多文件组织  涉及密码、帐户的函数放在一个文件中,完成各项功能的函数放在另一个文件中,main函放也单独一个文件。这
1060 0
+关注
xland
上市公司研发部门经理 管理着40个人以上的技术团队; 服务过诸多大型客户; 为很多知名开源项目提交过代码; 开发过几十万用户的APP; 技能:C++/.NET/JS/架构
329
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载