asp.net 2.0 中的URL重写以及urlMappings问题_实用技巧

在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); 
cxt.Response.Write("请求的路径:" + path); 
cxt.Response.Write("<BR>"); 
cxt.Response.Write("转向的目的URL:" + newUrl); 
cxt.Response.Write("<BR>"); 
cxt.RewritePath(newUrl); 

}//如果要求处理所有的请求时用到 
//else 
//{ 
// cxt.Response.Write(cxt.Request.Path + "<BR>"); 
// cxt.Response.Write("你请求的资源不存在或无权访问!"); 
// cxt.Response.Flush(); 
// cxt.Response.End(); 
//} 

}; 

}

由于一旦进行了URL重写,原先的WEBFORM中的Action会发生改变,容易造成:请求的资源不存在问题 

具体怎么样?各位DX看看就清楚了!!! 

所有才有了这个ResponseFilter了,实现如下, 

public class ResponseFilter:System.IO.Stream 

public ResponseFilter(System.IO.Stream sink,string _str) 

_sink = sink; 
// 
// TODO: 在此处添加构造函数逻辑 
// 
this.str = _str; 

private string str = ""; 
private System.IO.Stream _sink; 
private long _position; 
private System.Text.Encoding end=System.Text.Encoding.GetEncoding("GB18030"); 
private System.Text.StringBuilder oOutput = new System.Text.StringBuilder(); 
// The following members of Stream must be overriden. 
public override bool CanRead 

get { return true; } 

public override bool CanSeek 

get { return true; } 

public override bool CanWrite 

get { return true; } 

public override long Length 

get { return 0; } 

public override long Position 

get { return _position; } 
set { _position = value; } 

public override long Seek(long offset, System.IO.SeekOrigin direction) 

return _sink.Seek(offset, direction); 

public override void SetLength(long length) 

_sink.SetLength(length); 

public override void Close() 

_sink.Close(); 

public override void Flush() 

_sink.Flush(); 

public override int Read(byte[] buffer, int offset, int count) 

return _sink.Read(buffer, offset, count); 

// The Write method actually does the filtering. 
public override void Write(byte[] buffer, int offset, int count) 

string szBuffer = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count); 
string ap="action=\""; 
int pos=-1; 
if ((pos=szBuffer.IndexOf(ap) )!= -1) 

int epos = szBuffer.IndexOf("\"", pos + ap.Length+1); 
if (epos != -1) 

szBuffer= szBuffer.Remove(pos + ap.Length, epos - pos - ap.Length); 

szBuffer = szBuffer.Insert(pos + ap.Length, this.str); 

byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(szBuffer); 
_sink.Write(data, 0, data.Length); 


else 

oOutput.Append(szBuffer); 

//下面的这一段可以用来修改<Head></head>之间的内容; 
//Regex oEndFile = new Regex("</head>", RegexOptions.IgnoreCase|RegexOptions.Compiled); 
//if (oEndFile.IsMatch(szBuffer)) 
//{ 
// //Append the last buffer of data 
// //附加上缓冲区中的最后一部分数据 
// oOutput.Append(szBuffer); 
// //Get back the complete response for the client 
// //传回完整的客户端返回数据 
// string szCompleteBuffer = oOutput.ToString().ToLower(); 
// int ipos = szCompleteBuffer.IndexOf("<title>"); 
// int epos = szCompleteBuffer.IndexOf("</title>",ipos+7); 
// string sp = szCompleteBuffer.Substring(ipos+7, epos - ipos ); 
// szCompleteBuffer = szCompleteBuffer.Remove(ipos+7,sp.Length-7); 
// szCompleteBuffer = szCompleteBuffer.Insert(ipos + 7, "dhz"); 
// // szCompleteBuffer = szCompleteBuffer.Replace(sp, "dhz"); 
// //No match, so write out original data 
// //没有匹配,因此写入源代码 
// byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(szCompleteBuffer); 
// _sink.Write(data, 0, data.Length); 
//} 
//else 
//{ 
// oOutput.Append(szBuffer); 
//} 

//////而重候规则呢则是用xml文件配置如下; 

当然在web.config通过自定义配置节做也可以的 

<?xml version="1.0" encoding="utf-8" ?> 
<Rules> 
<RewriterRule> 
<LookFors> 
<LookFor>~/(\d{4})/(\d{2})\.html</LookFor> 
<LookFor>~/(\d{4})/(\d{2})/</LookFor> 
<LookFor>~/(\d{4})/(\d{2})</LookFor> 
<LookFor>~/(\d{4})/(\d{2})/index.html</LookFor> 
</LookFors> 
<SendTo>~/Pro.aspx?year=$1&month=$2</SendTo> 
</RewriterRule> 
<RewriterRule> 
<LookFors> 
<LookFor>~/pc</LookFor> 
</LookFors> 
<SendTo>~/Test2.aspx</SendTo> 
</RewriterRule> 
</Rules> 
//这个规则写的不好,如第一个就可以用一个正则表达式来做。

时间: 2024-09-28 03:59:37

asp.net 2.0 中的URL重写以及urlMappings问题_实用技巧的相关文章

ASP.NET 2.0 中收集的小功能点(转)_实用技巧

1.asp.net 2.0中的MaxPageStateFieldLength 属性 在asp.net 2.0中,可以强制对viewstate进行分段传输了,使用的是Page.MaxPageStateFieldLength 属性,可以设置viewstate中,每个页面状态字段的最大字节数.格式如下,要在WEB.CONFIG文件里设置的:<pages maxPageStateFieldLength="5" />其中,将设置把viewstate为不超过5字节,如果实际的views

asp.net不用设置iis实现url重写 类似伪静态路由_实用技巧

程序要调整的部分只有两块.一是web.config文件.二是链接地址.所需urlrewrite.dll 首先下载URLRewriter:http://download.microsoft.com/download/0/4/6/0463611e-a3f9-490d-a08c-877a83b797cf/MSDNURLRewriting.msi 下载安装后再bin目录下找到URLRewriter.dll文件 好了开始实施.第一步:将urlrewrite.dll下载到你的web程序目录里去.哪都行.我是

Asp.Mvc 2.0实现用户注册实例讲解(1)_实用技巧

最近一直在研究ASP.NET MVC,看了一些教程,总觉得印象不是太深刻,于是决定动手写一个系列的MVC教程,一方面是为了加深自己的印象,另一方面也给学习MVC的同学提供一些帮助,作为一个参考资料.本系列的教程将通过一个实例来由浅入深讲解MVC,相关知识点将在我们的实例中为大家讲解. Asp.mvc模式改变了传统的asp.net webform方式,我们在使用MVC开发WEB程序时,要摒弃传统的WEBFORM方式的思想,传统的WEBFORM方式用户拖拉一个按钮,然后双击按钮,就可以在后台写相应的

asp.net通过HttpModule自动在Url地址上添加参数_实用技巧

然而手机客户端又不支持Session和Cookie传值,其他方法给页面赋值再传值显得太麻烦了,而且还不易维护,容易弄丢出错,于是想到了用HttpModule来把cid参数赋在Url地址上,让url把cid参数每页自动传递下去,需要用cid时只要通过Requet["cid"]获取,这样就不用为传值而烦恼了. 以下是配置方法和源码. 1)在web.config配置文件中添加以下节点 复制代码 代码如下: <httpModules> <add name="Http

ASP.NET 网站开发中常用到的广告效果代码_实用技巧

用本贴持续记录一些收集的广告效果.希望给有需求的朋友们一些支持.也希望朋友们把我未记录的广告形式也给予一起回贴.使本贴更加的完善,也让更多的朋友们分享. 1.翻屏效果 翻屏效果 复制代码 代码如下: <html> <head></head> <body> <div style="HEIGHT:85px"> <script LANGUAGE='JavaScript'> document.ns = navigator.

解析.Net 4.0 中委托delegate的使用详解_实用技巧

.Net中的委托从功能上讲和c语言或者c++中的方法指针类似,可以像调用方法一样调用委托完成某个功能,或返回某类结果.但是.Net毕竟是更高级的语言,委托Delegate也更高级了,委托是一种数据接口,它包含调用目标和调用方法的指针:而在.Net中定义的委托都继承自MulticastDelegate即多播委托,所谓的多播委托是指可以包含多个调用方法的委托.一. 先来看下委托的定义:如下C#代码定义委托public delegate void DoSomething(int times);委托的定

asp.net TemplateField模板中的Bind方法和Eval方法_实用技巧

比如我们要取个日期型的数据,在数据库中列名是updated,数值是2008/06/01.但是想2008年06月01日这样显示,我们可以这样来写Bind("updated", "{0:yyyy年MM月dd日}"),Eval也是如此. 2者都能读取数据中的值,并显示.当我们使用编辑更新操作时,Bind能够自动的将修改的值更新到数据库中,并显示出修改后的值.但是用了Eval却只能得到错误画面,新的数据没有更新到数据库中. 从这点看来,Bind方法和Eval方法的区别就是:

asp.net 2.0中的url映射

asp.net 介绍 url映射是asp.net 2.0的一个新的特性,它可以让开发人员把一个页映射到另一个url上.如果一个url请求过来,程序会自动把它重新映射到服务端.例如,如果你在程序中配置了把~/Beverages.aspx映射到了~/ProductsByCategory.aspx?CategoryID=1&CategoryName=Beverages,那么当用户在浏览器中输入了http://YourSite.com/Beverages.aspx,服务器会接收后会自动的转到http:/

asp.net开发中怎样去突破文件依赖缓存_实用技巧

在Web项目中可以使用Session,Application等来缓存数据,也可以使用Cache来缓存. 今天我们特别关注的是Cache缓存.Cache位于命名空间System.Web.Caching命名空间下,看到这里我们想到的是它在Web项目中使用. 说明:Cache 类不能在 ASP.NET 应用程序外使用.它是为在 ASP.NET 中用于为 Web 应用程序提供缓存而设计和测试的.在其他类型的应用程序(如控制台应用程序或 Windows 窗体应用程序)中,ASP.NET 缓存可能无法正常工