Eine neue Funktion in Asp.Net 2.0 ist die integrierte Unterstützung für das Umschreiben von URLs. Als ich mir diese neue Funktion ansah, stellte ich fest, dass sie keine Unterstützung für reguläre Ausdrücke bietet, was eigentlich der Sinn eines URL-Mappers ist. ScottGlu erklärt in seinem Blog den Grund, warum das Asp.Net-Team diese Funktion nicht implementiert hat. Grundsätzlich wurde ihnen klar, dass eine Vollversion die Vorteile der nächsten neuen IIS 7.0-Funktionen nutzen möchte, insbesondere die Unterstützung für alle Inhaltstypen (Bilder und Verzeichnisse).
Wie auch immer, es ist wirklich einfach, ein URL-Rewriting-Modul mit Regex-Unterstützung in Asp.Net zu implementieren. Ich habe dafür ein schnelles und einfaches HttpModule geschrieben. Die ganze Magie wird innerhalb weniger Zeilen innerhalb des HttpModule erledigt:
1 public void Rewrite_BeginRequest(object sender, System.EventArgs args) {
2 string strPath = HttpContext.Current.Request.Url.AbsolutePath;
3 UrlRedirection oPR = new UrlRedirection();
4 string strURL = strPath;
5 string strRewrite = oPR.GetMatchingRewrite(strPath);
6 if (!String.IsNullOrEmpty(strRewrite)) {
7 strURL = strRewrite;
8 } sonst {
9 strURL = strPath;
10 }
11 HttpContext.Current.RewritePath("~" + strURL);
12 }
Der Code ist selbsterklärend. Wenn eine Anfrage von der Asp.Net-Engine verarbeitet wird, überprüft das Modul eine XML-Datei auf eine Regex-Übereinstimmung. Ich habe viele Url-Rewriting-Engines gesehen, die Web.config verwenden, um die passenden Regeln zu speichern, aber ich bevorzuge die Verwendung einer zusätzlichen XML-Datei. Die Datei mit den Umschreibungsregeln sieht wie folgt aus:
1 <?xml version="1.0" binding="utf-8" standalone="yes"?>
2 <urlrewrites>
3 <rule name="Category Page">
4 <url>/([a-zA-Z][w-]{1,149}).aspx</url>
5 <rewrite>/Default.aspx?Category=$1</rewrite>
6 </rule>
7 <rule name="Item Page">
8 <url>/([a-zA-Z][w-]{1,149})/([a-zA-Z][w-]{1,149}).aspx</url>
9 <rewrite>/Default.aspx?Category=$1&Item=$2</rewrite>
10 </rule>
11 </urlrewrites>
Die Regelabgleichsroutine, die in der GetMatchingRewrite()-Methode implementiert ist, ist recht einfach und leichtgewichtig:
1 öffentlicher String GetMatchingRewrite(string URL) {
2 string strRtrn = "";
3
4 System.Text.RegularExpressions.Regex oReg;
5
6 foreach (RedirectRule orRule in Rules) {
7
8 Reg = neuer Regex(oRule.URL);
9 Match oMatch = oReg.Match(URL);
10
11 if (oMatch.Success) {
12 strRtrn = oReg.Replace(URL, oRule.Rewrite);
13 }
14
15 }
16 return strRtrn;
17 }
Ich habe ein Beispielprojekt hochgeladen, das diese Rewriting-Engine verwendet. Das HttpModule und seine Hilfsklassen befinden sich im Ordner App_Code. Ich hoffe, dass Sie diesen Code nützlich finden. Wenn Sie Fragen haben, hinterlassen Sie einfach einen Kommentar in diesem Eintrag. Viel Spaß beim Codieren!
-------------------------------------------------- ----------------
VON DEVEL.oping.net
Gepostet am 26.04.2006 um 14:17 Uhr. Gepostet von Asp.net. Gepostet (48) Gepostet (1) Gepostet mit 365 Schlüsselwörtern: .net2.0
Beschreibung:
# Betreff: URL-Umschreiben mit Regex für ASP.NET 2.0(在asp.net2.0中使用正规表达式建立URL重写) 2006-04-26 20:22 | AXii
wird verwendet, um 1 public void Rewrite_BeginRequest(object sender, System.EventArgs args) anzuzeigen.
2 {
3 Zeichenfolge appPath = HttpContext.Current.Request.ApplicationPath;
4 HttpContext.Current.Response.Write(appPath + "<br />");
5
6 string strPath = HttpContext.Current.Request.Url.AbsolutePath;
7 HttpContext.Current.Response.Write(strPath + "<br />");
8
9 strPath = strPath.Substring(appPath.Length);
10
11 HttpContext.Current.Response.Write(strPath + "<br />");
12
13 UrlRedirection oPR = new UrlRedirection();
14
15 string strURL = strPath;
16
17 string strRewrite = oPR.GetMatchingRewrite(strPath);
18
19 if (!String.IsNullOrEmpty(strRewrite))
20 {
21 strURL = strRewrite;
22 }
23 sonst
24 {
25 strURL = strPath;
26 }
27
28 HttpContext.Current.RewritePath("~" + strURL);
29 }解决虚拟路径问题.
2.