asp.net 不用組件的URL重寫(適用于較大型項目)
更新時間:2009年04月27日 02:09:16 作者:
網(wǎng)上很多關于url重寫的教程都推薦下載某某某組件, 我個人不喜歡這樣,即使是M$的組件也一樣,因為我們干程序員的,越貼近真相越好。那么我也寫一個關于url重寫的文章,希望對和我一樣有個性的coder們有點幫助。
先在網(wǎng)站根目錄下建立一個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>
我這里只寫了一種規(guī)則,然后修改網(wǎng)站的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
節(jié)。對早期版本的 IIS 來說則不需要此節(jié)。
-->
<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>
/// 實現(xiàn)接口的Init方法
/// </summary>
/// <param name="context"></param>
public void Init(HttpApplication context)
{
//建立個委托讓他執(zhí)行下面的ReUrl_BeginRequest事件
context.BeginRequest += new EventHandler(ReUrl_BeginRequest);
}
/// <summary>
/// 實現(xiàn)接口的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; }
}
//構造函數(shù)
private SiteUrls()
{
Urls = new System.Collections.ArrayList();
Paths = new System.Collections.Specialized.NameValueCollection();
//以XML個數(shù)讀取那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 構造函數(shù)
public URLRewrite(string name, string pattern, string page, string querystring)
{
_Name = name;
_Pattern = pattern;
_Page = page;
_QueryString = querystring;
}
#endregion
}
#endregion
}
}
復制代碼 代碼如下:
<?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>
我這里只寫了一種規(guī)則,然后修改網(wǎng)站的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
節(jié)。對早期版本的 IIS 來說則不需要此節(jié)。
-->
<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>
/// 實現(xiàn)接口的Init方法
/// </summary>
/// <param name="context"></param>
public void Init(HttpApplication context)
{
//建立個委托讓他執(zhí)行下面的ReUrl_BeginRequest事件
context.BeginRequest += new EventHandler(ReUrl_BeginRequest);
}
/// <summary>
/// 實現(xiàn)接口的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; }
}
//構造函數(shù)
private SiteUrls()
{
Urls = new System.Collections.ArrayList();
Paths = new System.Collections.Specialized.NameValueCollection();
//以XML個數(shù)讀取那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 構造函數(shù)
public URLRewrite(string name, string pattern, string page, string querystring)
{
_Name = name;
_Pattern = pattern;
_Page = page;
_QueryString = querystring;
}
#endregion
}
#endregion
}
}
相關文章
asp.net URL中包含中文參數(shù)造成亂碼的解決方法
中文亂碼一直以來是WEB開發(fā)中比較常見的問題之一,對于初學者來說,各種各樣的編碼方式可能會有點不適應,本篇文章并不講述這些編碼,而是把自己遇到的一個小問題以及該問題的解決之法說明一下,希望對大家有用。2010-03-03ASP.NET Core MVC解決控制器同名Action請求不明確的問題
這篇文章主要介紹了ASP.NET Core MVC解決控制器同名Action請求不明確的問題,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03用戶控件(ASCX)向網(wǎng)頁(ASPX)傳值使用反射實現(xiàn)
用戶控件向網(wǎng)頁傳遞值,網(wǎng)上的方法有很多,本文嘗試一下使用反射來實現(xiàn),感興趣的朋友可以參考下哈,希望可以幫助到你2013-03-03ASP.NET環(huán)境下為網(wǎng)站增加IP過濾功能
通過深入的交流和溝通,確認了該發(fā)電廠在企業(yè)網(wǎng)站用戶訪問控制方面的改進要求2009-06-06