Una nueva característica de Asp.Net 2.0 es su soporte integrado para reescritura de URL. Cuando analicé esta nueva característica descubrí que carecía de soporte para expresiones regulares, que es realmente el objetivo de un Url Mapper. ScottGlu en su blog explica la razón por la cual el equipo de Asp.Net no implementó esta característica. Básicamente se dieron cuenta de que una versión con todas las funciones querría aprovechar las próximas nuevas características de IIS 7.0, especialmente el soporte para todos los tipos de contenido (imágenes y directorios).
De todos modos, es realmente sencillo implementar un módulo de reescritura de URL con soporte Regex en Asp.Net. Escribí un HttpModule rápido y sencillo para esto. Toda la magia se realiza en unas pocas líneas dentro del HttpModule:
1 public void Rewrite_BeginRequest(object sender, System.EventArgs args) {
2 cadenas strPath = HttpContext.Current.Request.Url.AbsolutePath;
3 UrlRedirection oPR = nueva UrlRedirection();
4 cadenas strURL = strPath;
5 cadenas strRewrite = oPR.GetMatchingRewrite(strPath);
6 si (!String.IsNullOrEmpty(strRewrite)) {
7 strURL = strReescribir;
8 } más {
9 strURL = strPath;
10 }
11 HttpContext.Current.RewritePath("~" + strURL);
12 }
El código se explica por sí mismo. Cuando una solicitud es procesada por el motor Asp.Net, el módulo verifica un xml para detectar una coincidencia de expresiones regulares. He visto muchos motores de reescritura de URL que usan Web.config para almacenar las reglas coincidentes, pero prefiero usar un archivo xml adicional. El archivo de reglas de reescritura tiene el siguiente aspecto:
1 <?xml version="1.0" encoding="utf-8" standalone="yes"?>
2 <reescrituras de URL>
3 <nombre de regla="Página de categoría">
4 <url>/([a-zA-Z][w-]{1,149}).aspx</url>
5 <rewrite>/Default.aspx?Category=$1</rewrite>
6 </regla>
7 <nombre de la regla="Página del artículo">
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 </regla>
11 </urlrewrites>
La rutina de coincidencia de reglas, que se implementa en el método GetMatchingRewrite(), es bastante simple y ligera:
1 public string GetMatchingRewrite(string URL) {
2 cadenas strRtrn = "";
3
4 System.Text.RegularExpressions.Regex oReg;
5
6 foreach (RedirectRule oRegla en Reglas) {
7
8 Reg = nueva expresión regular (oRule.URL);
9 Coincidencia oMatch = oReg.Match(URL);
10
11 si (oMatch.Éxito) {
12 strRtrn = oReg.Replace(URL, oRule.Rewrite);
13 }
14
15 }
16 retorno strRtrn;
17 }
He subido un proyecto de muestra que utiliza este motor de reescritura. HttpModule y sus clases auxiliares están dentro de la carpeta App_Code. Espero que este código te resulte útil, si tienes alguna pregunta simplemente deja un comentario en esta entrada. ¡Feliz codificación!
-------------------------------------------------- ------------------------------
DE DEVEL.oping.net
publicado el 26/04/2006 14:17 徐灿钊Asp.net专栏 阅读(48) 评论(1) 编辑 收藏 收藏至365Key 所属分类: .net2.0
Palabras clave:
# re: Reescritura de URL con expresiones regulares para ASP.NET 2.0 (在asp.net2.0中使用正规表达式建立URL重写) 2006-04-26 20:22 | AXii
哈哈哈,测试后 1 public void Rewrite_BeginRequest(remitente del objeto, argumentos System.EventArgs)
2 {
appPath de 3 cadenas = HttpContext.Current.Request.ApplicationPath;
4 HttpContext.Current.Response.Write(appPath + "<br />");
5
6 cadenas 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 = nueva UrlRedirection();
14
15 cadenas strURL = strPath;
16
17 cadena strRewrite = oPR.GetMatchingRewrite(strPath);
18
19 si (!String.IsNullOrEmpty(strRewrite))
20 {
21 strURL = strReescribir;
22 }
23 más
24 {
25 strURL = strPath;
26 }
27
28 HttpContext.Current.RewritePath("~" + strURL);
29 } 发现这个处理办法对于虚拟路径会出现转发错误,注意第2、3、9行,是我增加的,可以有效的解决虚拟路径问题.
2、无法满足页面回发的问题!如何解决,还请您来修改:):