asp.net 不用组件的URL重写(适用于较大型项目)

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

  

复制代码 代码如下:

  <?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文件,修改后的代码为:

  

复制代码 代码如下:

  <?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的类文件。

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

  

复制代码 代码如下:

  //用到的命名空间

  using System;

  using System.Diagnostics;

  using System.Threading;

  using System.Web;

  using System.Xml;

  using System.Text.RegularExpressions;

  using System.IO;

  //注意名称空间

  namespace my.Forum

  {

  //继承自IHttpModule接口

  public class HttpModule : System.Web.IHttpModule

  {

  /// <summary>

  /// 实现接口的Init方法

  /// </summary>

  /// <param name="context"></param>

  public void Init(HttpApplication context)

  {

  //建立个委托让他执行下面的ReUrl_BeginRequest事件

  context.BeginRequest += new EventHandler(ReUrl_BeginRequest);

  }

  /// <summary>

  /// 实现接口的Dispose方法

  /// </summary>

  public void Dispose()

  {

  }

  private void ReUrl_BeginRequest(object sender, EventArgs e)

  {

  HttpContext context = ((HttpApplication) sender).Context;

  string requestPath = context.Request.Path.ToLower();

  //SiteUrls是下面的一个类,这里大家可以重构下

  foreach (SiteUrls.URLRewrite url in SiteUrls.GetSiteUrls().Urls)

  {

  //是否找到了匹配选项

  if (Regex.IsMatch(requestPath, url.Pattern, RegexOptions.None | RegexOptions.IgnoreCase))

  {

  //开始替换成我们程序能读懂的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

  {

  //定义成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

  {

  get { return _Urls; }

  set { _Urls = value; }

  }

  //这个就是个键植对 表害怕一点也不高深

  private System.Collections.Specialized.NameValueCollection _Paths;

  public System.Collections.Specialized.NameValueCollection Paths

  {

  get { return _Paths; }

  set { _Paths = value; }

  }

  //构造函数

  private SiteUrls()

  {

  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)

  {

  //XmlNodeType.Comment如果不是注释

  if (n.NodeType != XmlNodeType.Comment && n.Name.ToLower() == "rewrite")

  {

  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)

  {

  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()

  {

  if (instance == null)

  {

  instance = new SiteUrls();

  }

  return instance;

  }

  #region url实体类

  public class URLRewrite

  {

  #region 成员变量

  private string _Name;

  public string Name

  {

  get { return _Name; }

  set { _Name = value; }

  }

  private string _Pattern;

  public string Pattern

  {

  get { return _Pattern; }

  set { _Pattern = value; }

  }

  private string _Page;

  public string Page

  {

  get { return _Page; }

  set { _Page = value; }

  }

  private string _QueryString;

  public string QueryString

  {

  get { return _QueryString; }

  set { _QueryString = value; }

  }

  #endregion

  #region 构造函数

  public URLRewrite(string name, string pattern, string page, string querystring)

  {

  _Name = name;

  _Pattern = pattern;

  _Page = page;

  _QueryString = querystring;

  }

  #endregion

  }

  #endregion

  }

  }