Une nouvelle fonctionnalité d'Asp.Net 2.0 est la prise en charge intégrée de la réécriture d'URL. Lorsque j'ai examiné cette nouvelle fonctionnalité, j'ai découvert qu'elle ne prenait pas en charge les expressions régulières, ce qui est vraiment l'intérêt d'un Url Mapper. ScottGlu sur son blog explique la raison pour laquelle l'équipe Asp.Net n'a pas implémenté cette fonctionnalité. Fondamentalement, ils ont réalisé qu'une version complète voudrait profiter des prochaines nouvelles fonctionnalités d'IIS 7.0, notamment la prise en charge de tous les types de contenu (images et répertoires).
Quoi qu'il en soit, il est très simple d'implémenter un module de réécriture d'URL avec prise en charge de Regex dans Asp.Net. J'ai écrit un HttpModule simple et rapide pour cela. Toute la magie se fait en quelques lignes dans le HttpModule :
1 public void Rewrite_BeginRequest(object sender, System.EventArgs args) {
2 chaînes strPath = HttpContext.Current.Request.Url.AbsolutePath ;
3 UrlRedirection oPR = new UrlRedirection();
4 chaînes strURL = strPath ;
5 chaînes strRewrite = oPR.GetMatchingRewrite(strPath);
6 si (!String.IsNullOrEmpty(strRewrite)) {
7 strURL = strRewrite;
8 } autre {
9 strURL = strPath ;
10 }
11 HttpContext.Current.RewritePath("~" + strURL);
12 }
Le code est explicite. Lorsqu'une requête est traitée par le moteur Asp.Net, le module vérifie un fichier XML pour une correspondance d'expression régulière. J'ai vu de nombreux moteurs de réécriture d'URL qui utilisent Web.config pour stocker les règles de correspondance, mais je préfère utiliser un fichier XML supplémentaire. Le fichier de règles de réécriture ressemble à ceci :
1 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
2 <urlréécritures>
3 <nom de la règle="Page de catégorie">
4 <url>/([a-zA-Z][w-]{1,149}).aspx</url>
5 <rewrite>/Default.aspx?Category=$1</rewrite>
6 </règle>
7 <nom de la règle="Page de l'élément">
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 </règle>
11 </urlrewrites>
La routine de correspondance de règles, implémentée dans la méthode GetMatchingRewrite(), est assez simple et légère :
1 chaîne publique GetMatchingRewrite(string URL) {
2 chaîne strRtrn = "";
3
4 System.Text.RegularExpressions.Regex oReg;
5
6 foreach (RedirectRule oRule dans les règles) {
7
8 Reg = nouvelle Regex (oRule.URL);
9 Correspondance oMatch = oReg.Match(URL);
10
11 si (oMatch.Success) {
12 strRtrn = oReg.Replace(URL, oRule.Rewrite);
13 }
14
15 }
16 retour strRtrn ;
17 }
J'ai téléchargé un exemple de projet qui utilise ce moteur de réécriture. Le HttpModule et ses classes d'assistance se trouvent dans le dossier App_Code. J'espère que vous trouverez ce code utile, si vous avez des questions, laissez simplement un commentaire dans cette entrée. Bon codage !
-------------------------------------------------- -------------------------------
DE DEVEL.oping.net
publié le 2006-04-26 14:17 Version Asp.net Version (48) Version (1) Version actuelle Version 365Key Version : .net2.0
Lire :
# re : Réécriture d'URL avec Regex pour ASP.NET 2.0 (在asp.net2.0中使用正规表达式建立URL重写) 2006-04-26 20:22 | AXii
哈哈哈,测试后 1 public void Rewrite_BeginRequest (expéditeur d'objet, arguments System.EventArgs)
2 {
3 chaînes appPath = HttpContext.Current.Request.ApplicationPath ;
4 HttpContext.Current.Response.Write(appPath + "<br />");
5
6 chaînes 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 chaînes strURL = strPath ;
16
17 chaîne strRewrite = oPR.GetMatchingRewrite(strPath);
18
19 si (!String.IsNullOrEmpty(strRewrite))
20 {
21 strURL = strRewrite;
22 }
23 autres
24 {
25 strURL = strPath ;
26 }
27
28 HttpContext.Current.RewritePath("~" + strURL);
29 }解决虚拟路径问题。
2、无法满足页面回发的问题!如何解决,还请您来修改:):