Новой функцией Asp.Net 2.0 является встроенная поддержка перезаписи URL-адресов. Когда я изучил эту новую функцию, я обнаружил, что в ней отсутствует поддержка регулярных выражений, что на самом деле является целью Url Mapper. СкоттГлу в своем блоге объясняет причину, по которой команда Asp.Net не реализовала эту функцию. По сути, они поняли, что полнофункциональная версия будет использовать преимущества следующих новых функций IIS 7.0, особенно поддержку всех типов контента (изображений и каталогов).
В любом случае, реализовать модуль перезаписи URL-адресов с поддержкой Regex в Asp.Net очень просто. Для этого я написал быстрый и простой HttpModule. Вся магия выполняется в нескольких строках внутри HttpModule:
1 public void Rewrite_BeginRequest(object sender, System.EventArgs args) {
2 строки strPath = HttpContext.Current.Request.Url.AbsolutePath;
3 UrlRedirection oPR = новое UrlRedirection();
4 строки strURL = strPath;
5 строка strRewrite = oPR.GetMatchingRewrite(strPath);
6 if (!String.IsNullOrEmpty(strRewrite)) {
7 стрURL = стрRewrite;
8 } еще {
9 стрURL = стрПат;
10 }
11 HttpContext.Current.RewritePath("~" + strURL);
12 }
Код не требует пояснений. Когда запрос обрабатывается механизмом Asp.Net, модуль проверяет XML на соответствие регулярному выражению. Я видел множество механизмов перезаписи URL-адресов, которые используют Web.config для хранения правил сопоставления, но я предпочитаю использовать дополнительный XML-файл. Файл правил перезаписи выглядит следующим образом:
1 <?xml version="1.0"coding="utf-8" Standalone="yes"?>
2 <перезапись URL>
3 <rule name="Страница категории">
4 <url>/([a-zA-Z][w-]{1,149}).aspx</url>
5 <rewrite>/Default.aspx?Category=$1</rewrite>
6 </правило>
7 <rule name="Страница элемента">
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 </правило>
11 </urlrewrites>
Процедура сопоставления правил, реализованная в методе GetMatchingRewrite(), довольно проста и облегченна:
1 public string GetMatchingRewrite(string URL) {
2 строка strRtrn = "";
3
4 System.Text.RegularExpressions.Regex oReg;
5
6 foreach (RedirectRule oRule в правилах) {
7
8 Reg = новое регулярное выражение(oRule.URL);
9 Соответствие oMatch = oReg.Match(URL);
10
11, если (oMatch.Success) {
12 strRtrn = oReg.Replace(URL, oRule.Rewrite);
13 }
14
15 }
16 возврат стрРтрн;
17 }
Я загрузил пример проекта, в котором используется этот механизм переписывания. HttpModule и его вспомогательные классы находятся внутри папки App_Code. Надеюсь, этот код окажется для вас полезным. Если у вас есть какие-либо вопросы, просто оставьте комментарий в этой записи. Приятного кодирования!
-------------------------------------------------- ------------------------------
С сайта DEVEL.oping.net
опубликовано 26 апреля 2006 г., 14:17 徐灿钊Asp.net专栏 阅读(48) 评论(1) 编辑 收藏 收藏至365Key 所属分类: .net2.0
Перевод:
# re: Перезапись URL-адресов с помощью Regex для ASP.NET 2.0 (在asp.net2.0中使用正规表达式建立URL重写) 2006-04-26 20:22 | AXii
哈哈哈,测试后 1 public void Rewrite_BeginRequest(отправитель объекта, System.EventArgs args)
2 {
3-строчный appPath = HttpContext.Current.Request.ApplicationPath;
4 HttpContext.Current.Response.Write(appPath + "<br />");
5
6 строка 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 = новое UrlRedirection();
14
15 строка strURL = strPath;
16
17 строка strRewrite = oPR.GetMatchingRewrite(strPath);
18
19, если (!String.IsNullOrEmpty(strRewrite))
20 {
21 стрURL = стрRewrite;
22 }
еще 23
24 {
25 стрURL = стрПат;
26 }
27
28 HttpContext.Current.RewritePath("~" + strURL);
29 } 发现这个处理办法对于虚拟路径会出现转发错误,注意第2,3、9行,是我增加的,可以有效的解决虚拟路径问题。
2. 无法满足页面回发的问题!如何解决,还请您来修改:):