|
|
| asp.net 2.0中的URL重写以及urlMappings问题(2) |
| 作者:不详 来源:不详 发布时间:2006-8-14 8:47:45 发布人:chinazhan |
减小字体
增大字体
由于一旦进行了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> //这个规则写的不好,如第一个就可以用一个正则表达式来做。但是一时不知道怎么写好,好像要用到什么反捕获组的概念,正在思考这个东东!! 做人要厚道,请注明转自chinazhan中国站长(www.ChinaZhan.com)。
|
| |
|
[]
[返回上一页]
[打 印]
[收 藏] |
|
| ∷相关文章评论∷ (评论内容只代表网友观点,与本站立场无关!) [更多评论...] |
|
|