首页 > 编程 > .NET > 正文

asp.net 2.0 中的URL重写以及urlMappings问题

2024-07-10 12:40:10
字体:
来源:转载
供稿:网友
在asp.net2.0中的urlMappings倒是非常好用,可惜暂不支持正则表达式,不过,好在如果用IHttpModule的话 

不管什么样的请求都会先经过IHttpModule这样就为URL重写提供了一个好机会: 

下面是我写的一个IHttpModule: 

using System; 
using System.Web; 

public class ReWriteModule:IHttpModule 

public ReWriteModule() 


public override string ToString() 

return this.GetType().ToString(); 



void IHttpModule.Dispose() 



private static System.Xml.XmlDocument ruleDoc = null; 
private static System.Xml.XmlDocument GetRuleConfig(System.Web.HttpContext app) 

if (ruleDoc == null) 

ruleDoc = new System.Xml.XmlDocument(); 
ruleDoc.Load(app.Server.MapPath("~/rule.xml")); 

return ruleDoc; 

public static string GetUrl(System.Web.HttpContext cxt,string path) 


System.Xml.XmlDocument doc = GetRuleConfig(cxt); 
System.Xml.XmlNodeList lst= doc.GetElementsByTagName("RewriterRule"); 
string pat=""; 
foreach (System.Xml.XmlNode nd in lst) 

System.Xml.XmlNodeList sub = nd.ChildNodes[0].ChildNodes; 
foreach(System.Xml.XmlNode chk in sub) 

pat = "^" + chk.InnerText+"$"; 
System.Text.RegularExpressions.Regex reg = new System.Text.RegularExpressions.Regex(pat, System.Text.RegularExpressions.RegexOptions.Compiled | System.Text.RegularExpressions.RegexOptions.IgnoreCase); 
if(reg.IsMatch(path)) 

return reg.Replace(path, nd.ChildNodes[1].InnerText); 



return null; 


void IHttpModule.Init(HttpApplication context) 

context.BeginRequest += delegate(object sender, EventArgs e) 



System.Web.HttpContext cxt = context.Context; 

if (cxt.Request.ContentType != "image/pjpeg") 

string type = cxt.Request.ContentType.ToLower(); 
string path = cxt.Request.Path; 
string apppath = cxt.Request.ApplicationPath; 
path = path.Remove(0, apppath.Length); 
path = "~" + path; 

string newUrl = GetUrl(cxt, path.TrimEnd().TrimStart()); 
if (newUrl != null) 

cxt.Response.Filter = new ResponseFilter(cxt.Response.Filter,cxt.Request.Path); 
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表