ASP.NET不用組件的URL重寫

網上不少關於url重寫的教程都推薦下載某某某組件,

我我的不喜歡這樣,即便是M$的組件也同樣,由於咱們幹程序員的,越貼近真相越好

那麼我也寫一個關於url重寫的文章,但願對和我同樣有個性的coder們有點幫助

先在網站根目錄下創建一個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
    }
}
相關文章
相關標籤/搜索