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

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

<?xml version="1.0" encoding="utf-8"?>
<urls>  
  <rewrite name="Product"
      path="/Product-{0}.aspx"
      pattern = "/Product-(\d+).aspx"
      page="/Product.aspx"
      querystring="pid=$1" />
  <rewrite name="Article"
      path="/messages/{0}.html"
      pattern = "/messages/(\d+).html"
      page="/Article.aspx"
      querystring="aid=$1" />  
  <rewrite name="Product"
    path="/Product/{0}"
    pattern = "/Product/(\d+)"
    page="/Product.aspx"
    querystring="pid=$1" />
    
  <rewrite name="default"
      path="/default-{0}-{1}.aspx"
      pattern = "/default-(\d+)-(\d+)?.aspx"
      page="/default.aspx"
      querystring="id=$1^page=$2" /> 
</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))
                {
                    string newUrl = string.Empty;
                    //开始替换成我们程序能读懂的url    
                    if (GetContainCount(requestPath, "/") > 1)
                    {
                        newUrl = Regex.Replace(requestPath.Substring(context.Request.Path.IndexOf("/")),
                                                url.Pattern, url.QueryString, RegexOptions.None | RegexOptions.IgnoreCase);
                    }
                    else
                    {
                        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);
                }
            }
        }


        /// <summary>
        /// 判断某个特定的字符 在一串值中出现的次数
        /// </summary>
        /// <param name="str"></param>
        /// <param name="symbol"></param>
        /// <returns></returns>
        private int GetContainCount(string str,string symbol)
        {
            char[] chars = str.ToCharArray();
            int Count = 0;
            foreach (char ch in chars)
            {
                if (ch.ToString().Equals(symbol))
                    Count++;
            }
            return Count;
        }
    }

    #region 
    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
    }
    #endregion
}

 


转载于:https://my.oschina.net/smartsmile/blog/815504

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值