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


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

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

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

 

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

不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)Code
不用组件的url重写(适用于较大型项目)<?xml version="1.0" encoding="utf-8"?>
不用组件的url重写(适用于较大型项目)
<urls>
不用组件的url重写(适用于较大型项目)  
<rewrite name="default"
不用组件的url重写(适用于较大型项目)      path
="/default-{0}-{1}.aspx"
不用组件的url重写(适用于较大型项目)      pattern 
= "/default-(\d+)(-(\d+))?.aspx"
不用组件的url重写(适用于较大型项目)      page
="/default.aspx"
不用组件的url重写(适用于较大型项目)      querystring
="id=$1^page=$3" />
不用组件的url重写(适用于较大型项目)
</urls>

 我这里只写了一种规则

 

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

不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)Code
不用组件的url重写(适用于较大型项目)<?xml version="1.0"?>
不用组件的url重写(适用于较大型项目)
<configuration>
不用组件的url重写(适用于较大型项目)    
<appSettings/>
不用组件的url重写(适用于较大型项目)    
<connectionStrings/>
不用组件的url重写(适用于较大型项目)    
<system.web>
不用组件的url重写(适用于较大型项目)        
<authentication mode="Windows"/>
不用组件的url重写(适用于较大型项目)        
<httpModules>
不用组件的url重写(适用于较大型项目)            
<add type="my.Forum.HttpModule" name="HttpModule"/>
不用组件的url重写(适用于较大型项目)        
</httpModules>
不用组件的url重写(适用于较大型项目)        
<compilation debug="true"/></system.web>
不用组件的url重写(适用于较大型项目)    
<!-- 
不用组件的url重写(适用于较大型项目)        在 Internet 信息服务 7.0 下运行 ASP.NET AJAX 需要 system.webServer
不用组件的url重写(适用于较大型项目)        节。对早期版本的 IIS 来说则不需要此节。
不用组件的url重写(适用于较大型项目)    
-->
不用组件的url重写(适用于较大型项目)    
<system.webServer>
不用组件的url重写(适用于较大型项目)        
<validation validateIntegratedModeConfiguration="false"/>
不用组件的url重写(适用于较大型项目)        
<modules>
不用组件的url重写(适用于较大型项目)            
<add type="my.Forum.HttpModule" name="HttpModule"/>
不用组件的url重写(适用于较大型项目)        
</modules>
不用组件的url重写(适用于较大型项目)    
</system.webServer>
不用组件的url重写(适用于较大型项目)
</configuration>

本来只写一个

<httpModules>
不用组件的url重写(适用于较大型项目)     
<add type="my.Forum.HttpModule" name="HttpModule"/>
</httpModules>

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

 

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

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

 

不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)Code
不用组件的url重写(适用于较大型项目)//用到的命名空间
不用组件的url重写(适用于较大型项目)
using System;
不用组件的url重写(适用于较大型项目)
using System.Diagnostics;
不用组件的url重写(适用于较大型项目)
using System.Threading;
不用组件的url重写(适用于较大型项目)
using System.Web;
不用组件的url重写(适用于较大型项目)
using System.Xml;
不用组件的url重写(适用于较大型项目)
using System.Text.RegularExpressions;
不用组件的url重写(适用于较大型项目)
using System.IO;
不用组件的url重写(适用于较大型项目)
不用组件的url重写(适用于较大型项目)
//注意名称空间
不用组件的url重写(适用于较大型项目)
namespace my.Forum
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)    
//继承自IHttpModule接口
不用组件的url重写(适用于较大型项目)
    public class HttpModule : System.Web.IHttpModule
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)    
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)        
/**//// <summary>
不用组件的url重写(适用于较大型项目)        
/// 实现接口的Init方法
不用组件的url重写(适用于较大型项目)        
/// </summary>
不用组件的url重写(适用于较大型项目)        
/// <param name="context"></param>

不用组件的url重写(适用于较大型项目)        public void Init(HttpApplication context)
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)        
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)            
//建立个委托让他执行下面的ReUrl_BeginRequest事件
不用组件的url重写(适用于较大型项目)
            context.BeginRequest += new EventHandler(ReUrl_BeginRequest);
不用组件的url重写(适用于较大型项目)        }

不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)        
/**//// <summary>
不用组件的url重写(适用于较大型项目)        
/// 实现接口的Dispose方法
不用组件的url重写(适用于较大型项目)        
/// </summary>

不用组件的url重写(适用于较大型项目)        public void Dispose()
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)        
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)        }

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

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

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

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

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

不用组件的url重写(适用于较大型项目)        
//这个就是个键植对 表害怕一点也不高深
不用组件的url重写(适用于较大型项目)
        private System.Collections.Specialized.NameValueCollection _Paths;
不用组件的url重写(适用于较大型项目)        
public System.Collections.Specialized.NameValueCollection Paths
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)        
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)            
get 不用组件的url重写(适用于较大型项目)return _Paths; }
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)            
set 不用组件的url重写(适用于较大型项目){ _Paths = value; }
不用组件的url重写(适用于较大型项目)        }

不用组件的url重写(适用于较大型项目)        
//构造函数
不用组件的url重写(适用于较大型项目)
        private SiteUrls()
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)        
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)            Urls 
= new System.Collections.ArrayList();            
不用组件的url重写(适用于较大型项目)            Paths 
= new System.Collections.Specialized.NameValueCollection();
不用组件的url重写(适用于较大型项目)            
//以XML个数读取那CONFIG文件
不用组件的url重写(适用于较大型项目)
            XmlDocument urlconfig = new XmlDocument();
不用组件的url重写(适用于较大型项目)            urlconfig.Load(UrlsFile);
不用组件的url重写(适用于较大型项目)            XmlNode root 
= urlconfig.SelectSingleNode("urls");
不用组件的url重写(适用于较大型项目)            
foreach (XmlNode n in root.ChildNodes)
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)            
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)                
//XmlNodeType.Comment如果不是注释
不用组件的url重写(适用于较大型项目)
                if (n.NodeType != XmlNodeType.Comment && n.Name.ToLower() == "rewrite")
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)                
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)                    XmlAttribute name 
= n.Attributes["name"];
不用组件的url重写(适用于较大型项目)                    XmlAttribute path 
= n.Attributes["path"];
不用组件的url重写(适用于较大型项目)                    XmlAttribute page 
= n.Attributes["page"];
不用组件的url重写(适用于较大型项目)                    XmlAttribute querystring 
= n.Attributes["querystring"];
不用组件的url重写(适用于较大型项目)                    XmlAttribute pattern 
= n.Attributes["pattern"];
不用组件的url重写(适用于较大型项目)
不用组件的url重写(适用于较大型项目)                    
if (name != null && path != null && page != null && querystring != null && pattern != null)
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)                    
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)                        Paths.Add(name.Value, path.Value);
不用组件的url重写(适用于较大型项目)                        
//压进去的都是url实体类
不用组件的url重写(适用于较大型项目)
                        Urls.Add(new URLRewrite(name.Value, pattern.Value, page.Value.Replace("^""&"), querystring.Value.Replace("^""&")));
不用组件的url重写(适用于较大型项目)                    }

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

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

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

不用组件的url重写(适用于较大型项目)        
//用方法实例化
不用组件的url重写(适用于较大型项目)
        public static SiteUrls GetSiteUrls()
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)        
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)            
if (instance == null)
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)            
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)                instance 
= new SiteUrls();
不用组件的url重写(适用于较大型项目)            }

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

不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)        
url实体类#region url实体类
不用组件的url重写(适用于较大型项目)        
public class URLRewrite
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)        
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)            
成员变量#region 成员变量
不用组件的url重写(适用于较大型项目)            
private string _Name;
不用组件的url重写(适用于较大型项目)            
public string Name
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)            
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)                
get
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)                
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)                    
return _Name;
不用组件的url重写(适用于较大型项目)                }

不用组件的url重写(适用于较大型项目)                
set
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)                
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)                    _Name 
= value;
不用组件的url重写(适用于较大型项目)                }

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

不用组件的url重写(适用于较大型项目)
不用组件的url重写(适用于较大型项目)            
private string _Pattern;
不用组件的url重写(适用于较大型项目)            
public string Pattern
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)            
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)                
get
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)                
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)                    
return _Pattern;
不用组件的url重写(适用于较大型项目)                }

不用组件的url重写(适用于较大型项目)                
set
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)                
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)                    _Pattern 
= value;
不用组件的url重写(适用于较大型项目)                }

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

不用组件的url重写(适用于较大型项目)
不用组件的url重写(适用于较大型项目)            
private string _Page;
不用组件的url重写(适用于较大型项目)            
public string Page
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)            
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)                
get
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)                
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)                    
return _Page;
不用组件的url重写(适用于较大型项目)                }

不用组件的url重写(适用于较大型项目)                
set
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)                
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)                    _Page 
= value;
不用组件的url重写(适用于较大型项目)                }

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

不用组件的url重写(适用于较大型项目)
不用组件的url重写(适用于较大型项目)            
private string _QueryString;
不用组件的url重写(适用于较大型项目)            
public string QueryString
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)            
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)                
get
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)                
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)                    
return _QueryString;
不用组件的url重写(适用于较大型项目)                }

不用组件的url重写(适用于较大型项目)                
set
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)                
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)                    _QueryString 
= value;
不用组件的url重写(适用于较大型项目)                }

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

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

不用组件的url重写(适用于较大型项目)
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)            
构造函数#region 构造函数
不用组件的url重写(适用于较大型项目)            
public URLRewrite(string name, string pattern, string page, string querystring)
不用组件的url重写(适用于较大型项目)不用组件的url重写(适用于较大型项目)            
不用组件的url重写(适用于较大型项目){
不用组件的url重写(适用于较大型项目)                _Name 
= name;
不用组件的url重写(适用于较大型项目)                _Pattern 
= pattern;
不用组件的url重写(适用于较大型项目)                _Page 
= page;
不用组件的url重写(适用于较大型项目)                _QueryString 
= querystring;
不用组件的url重写(适用于较大型项目)            }

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

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

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

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

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

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

 

文章写到这里就完了,

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

具体的规则可以自己设置

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

本文参考了discuz的代码

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

上一篇:在线部署web项目(适用于较大型项目)


下一篇:约束