Asp.Net 2.0 中的一个新功能是它内置的 url 重写支持。当我研究这个新功能时,我发现它缺乏正则表达式支持,这确实是 Url Mapper 的重点。 ScottGlu 在他的博客中解释了 Asp.Net 团队没有实现此功能的原因。基本上,他们意识到全功能版本需要利用下一个 IIS 7.0 新功能,特别是对所有内容类型(图像和目录)的支持。
无论如何,在 Asp.Net 中实现具有正则表达式支持的 URL 重写模块非常简单。我为此编写了一个快速而简单的 HttpModule。整个魔法是在 HttpModule 中的几行内完成的:
1 public void Rewrite_BeginRequest(object sender, System.EventArgs args) {
2 字符串strPath = HttpContext.Current.Request.Url.AbsolutePath;
3 UrlRedirection oPR = new UrlRedirection();
4 字符串 strURL = strPath;
5 字符串 strRewrite = oPR.GetMatchingRewrite(strPath);
6 if (!String.IsNullOrEmpty(strRewrite)) {
7 strURL = strRewrite;
8 } 其他 {
9 字符串URL=字符串路径;
10}
11 HttpContext.Current.RewritePath("~" + strURL);
12}
该代码是不言自明的。当 Asp.Net 引擎处理请求时,该模块会检查 xml 中是否存在正则表达式匹配。我见过许多使用 Web.config 来存储匹配规则的 URL 重写引擎,但我更喜欢使用附加的 xml 文件。重写规则文件如下所示:
1 <?xml version="1.0"encoding="utf-8"standalone="yes"?>
2 <url重写>
3 <规则名称=“类别页面”>
4 <url>/([a-zA-Z][w-]{1,149}).aspx</url>
5 <rewrite>/Default.aspx?Category=$1</rewrite>
6 </规则>
7 <规则名称=“项目页面”>
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 </url重写>
在 GetMatchingRewrite() 方法中实现的规则匹配例程非常简单且轻量级:
1 public string GetMatchingRewrite(string URL) {
2 字符串 strRtrn = "";
3
4 System.Text.RegularExpressions.Regex oReg;
5
6 foreach (规则中的RedirectRule oRule) {
7
8 Reg = new Regex(oRule.URL);
9 匹配 oMatch = oReg.Match(URL);
10
11 if (oMatch.Success) {
12 strRtrn = oReg.Replace(URL, oRule.Rewrite);
13}
14
15}
16返回strRtrn;
17}
我上传了一个使用此重写引擎的示例项目。 HttpModule 及其辅助类位于 App_Code 文件夹内。我希望您发现此代码有用,如果您有任何疑问,请在此条目中发表评论。快乐编码!
-------------------------------------------------- ------------------------------------------
来自DEVEL.oping.net
发表于 2006-04-26 14:17 徐灿钊Asp.net专栏阅读(48) 评论(1) 编辑收藏 收藏至365Key类别分类: .net2.0
评论:
# re: Url Rewriting with Regex for ASP.NET 2.0(在asp.net2.0中使用正规表达式创建URL重写) 2006-04-26 20:22 | AXii
哈,测试后1 public void Rewrite_BeginRequest(object sender, 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 = new UrlRedirection();
14
15 字符串 strURL = strPath;
16
17 字符串 strRewrite = oPR.GetMatchingRewrite(strPath);
18
19 if (!String.IsNullOrEmpty(strRewrite))
20 {
21 strURL = strRewrite;
22}
23 其他
24{
25 字符串URL = 字符串路径;
26}
27
28 HttpContext.Current.RewritePath("~" + strURL);
29 } 找到这个针对虚拟路径会出现转发错误的处理方法,注意第2、3、9行,是我增加的,可以有效的解决虚拟路径问题。
2、无法满足页面回发的问题!如何解决,还请您来修改:):