asp.net 不用組件的URL重寫(xiě)(適用于較大型項(xiàng)目)
<?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>
我這里只寫(xiě)了一種規(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 信息服務(wù) 7.0 下運(yùn)行 ASP.NET AJAX 需要 system.webServer
節(jié)。對(duì)早期版本的 IIS 來(lái)說(shuō)則不需要此節(jié)。
-->
<system.webServer>
<validation validateIntegratedModeConfiguration="false"/>
<modules>
<add type="my.Forum.HttpModule" name="HttpModule"/>
</modules>
</system.webServer>
</configuration>
本來(lái)只寫(xiě)一個(gè)
<httpModules>
<add type="my.Forum.HttpModule" name="HttpModule"/>
</httpModules>
就可以了,我這里寫(xiě)了兩個(gè)主要是為了演示如何兼容IIS7 ,然后在解決方案下新建一個(gè)項(xiàng)目(類(lèi)庫(kù)),起什么名字無(wú)所謂,主要是這個(gè)項(xiàng)目下一定要有一個(gè)命名空間為my.Forum的類(lèi)文件。
具體代碼我貼出來(lái) 詳細(xì)的解釋我都寫(xiě)在注釋里了。
//用到的命名空間
using System;
using System.Diagnostics;
using System.Threading;
using System.Web;
using System.Xml;
using System.Text.RegularExpressions;
using System.IO;
//注意名稱(chēng)空間
namespace my.Forum
{
//繼承自IHttpModule接口
public class HttpModule : System.Web.IHttpModule
{
/// <summary>
/// 實(shí)現(xiàn)接口的Init方法
/// </summary>
/// <param name="context"></param>
public void Init(HttpApplication context)
{
//建立個(gè)委托讓他執(zhí)行下面的ReUrl_BeginRequest事件
context.BeginRequest += new EventHandler(ReUrl_BeginRequest);
}
/// <summary>
/// 實(shí)現(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是下面的一個(gè)類(lèi),這里大家可以重構(gòu)下
foreach (SiteUrls.URLRewrite url in SiteUrls.GetSiteUrls().Urls)
{
//是否找到了匹配選項(xiàng)
if (Regex.IsMatch(requestPath, url.Pattern, RegexOptions.None | RegexOptions.IgnoreCase))
{
//開(kāi)始替換成我們程序能讀懂的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>");
//開(kāi)始把用戶(hù)便于記憶的URL替換成程序能讀懂的url
context.RewritePath(url.Page, string.Empty, newUrl);
}
}
}
}
public class SiteUrls
{
//定義成volatitle類(lèi)型主要是為了多線程訪問(wèn)方便,在這個(gè)示例程序中沒(méi)什么實(shí)際意義,項(xiàng)目大了就有用了
private static volatile SiteUrls instance = null;
string UrlsFile = HttpContext.Current.Server.MapPath("/config/urls.config");
//定義兩個(gè)屬性
private System.Collections.ArrayList _Urls;
public System.Collections.ArrayList Urls
{
get { return _Urls; }
set { _Urls = value; }
}
//這個(gè)就是個(gè)鍵植對(duì) 表害怕一點(diǎn)也不高深
private System.Collections.Specialized.NameValueCollection _Paths;
public System.Collections.Specialized.NameValueCollection Paths
{
get { return _Paths; }
set { _Paths = value; }
}
//構(gòu)造函數(shù)
private SiteUrls()
{
Urls = new System.Collections.ArrayList();
Paths = new System.Collections.Specialized.NameValueCollection();
//以XML個(gè)數(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);
//壓進(jìn)去的都是url實(shí)體類(lèi)
Urls.Add(new URLRewrite(name.Value, pattern.Value, page.Value.Replace("^", "&"),
querystring.Value.Replace("^", "&")));
}
}
}
}
//用方法實(shí)例化
public static SiteUrls GetSiteUrls()
{
if (instance == null)
{
instance = new SiteUrls();
}
return instance;
}
#region url實(shí)體類(lèi)
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 構(gòu)造函數(shù)
public URLRewrite(string name, string pattern, string page, string querystring)
{
_Name = name;
_Pattern = pattern;
_Page = page;
_QueryString = querystring;
}
#endregion
}
#endregion
}
}
- 使用.NET命令行編譯器編譯項(xiàng)目(如ASP.NET、C#等)
- 創(chuàng)建一個(gè)完整的ASP.NET Web API項(xiàng)目
- iis6偽靜態(tài)重寫(xiě)路徑的配置步驟(.net項(xiàng)目)
- .net 讀取項(xiàng)目AssemblyInfo.cs屬性值
- 使用ASP.NET.4.5.1+MVC5.0 搭建一個(gè)包含 Ninject框架 項(xiàng)目
- 如何為asp.net網(wǎng)站項(xiàng)目添加子項(xiàng)目
- 關(guān)于有些Asp.net項(xiàng)目發(fā)布后出現(xiàn)網(wǎng)址亂碼的解決方法
- ASP.NET Core新建項(xiàng)目教程(3)
- ASP.NET Core項(xiàng)目結(jié)構(gòu)教程(4)
相關(guān)文章
repeater、gridview 在綁定時(shí)判斷判斷顯示不同的行樣式或文本
repeater、gridview 在綁定時(shí)判斷判斷顯示不同的行樣式或文本的實(shí)現(xiàn)代碼,需要的朋友可以參考下。2011-09-09
.NET中實(shí)現(xiàn)對(duì)象數(shù)據(jù)映射示例詳解
這篇文章主要為大家介紹了.NET中實(shí)現(xiàn)對(duì)象數(shù)據(jù)映射示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-10-10
在WinForm和WPF中使用GMap.Net地圖插件簡(jiǎn)單教程
GMap.NET是一個(gè)強(qiáng)大、免費(fèi)、跨平臺(tái)、開(kāi)源的.NET控件,它在Windows Forms 和WPF環(huán)境中能夠使用來(lái)自Google, Yahoo!, Bing, OpenStreetMap, ArcGIS, Pergo, SigPac等地圖,下面看一下使用方法2013-12-12
asp.net 結(jié)合mysql存儲(chǔ)過(guò)程進(jìn)行分頁(yè)代碼
最近用mysql + asp.net來(lái)寫(xiě)網(wǎng)站,既然mysql已經(jīng)支持存儲(chǔ)過(guò)程了,那么像分頁(yè)這么常用的東西,當(dāng)然要用存儲(chǔ)過(guò)程啦2008-11-11
asp.net使用ODP即oracle連接方式的的防注入登錄驗(yàn)證程序
這篇文章主要介紹了asp.net使用ODP即oracle連接方式的的防注入登錄驗(yàn)證程序,需要的朋友可以參考下2014-05-05
ASP.NET MVC使用jQuery Template實(shí)現(xiàn)批量更新
這篇文章介紹了ASP.NET MVC使用jQuery Template實(shí)現(xiàn)批量更新的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-07-07
ASP.NET學(xué)習(xí)CORE中使用Cookie身份認(rèn)證方法
本篇文章主要給大家詳細(xì)分析了ASP.NET學(xué)習(xí)CORE中使用Cookie身份認(rèn)證方法以及相關(guān)的實(shí)例代碼,有需要的朋友參考下吧。2018-01-01
.net?core利用PdfSharpCore操作PDF實(shí)例教程
操作pdf是我們?nèi)粘i_(kāi)發(fā)中經(jīng)常遇到的功能,下面這篇文章主要給大家介紹了關(guān)于.net?core利用PdfSharpCore操作PDF實(shí)例的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-12-12
.NET Framework常用ORM框架iBatis.Net操作數(shù)據(jù)庫(kù)的方法
iBatis.Net 是一個(gè)輕量級(jí)的 ORM 框架,它允許開(kāi)發(fā)者通過(guò)直接編寫(xiě) SQL 查詢(xún)來(lái)操作數(shù)據(jù)庫(kù),并將查詢(xún)結(jié)果映射到對(duì)象模型中,本文將通過(guò)實(shí)際的代碼示例,詳細(xì)介紹如何在 .NET 環(huán)境中使用 iBatis.Net 進(jìn)行數(shù)據(jù)庫(kù)操作,感興趣的朋友一起看看吧2024-08-08

