|
|

由于一旦进行了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);
- }
-
- //下面的这一段可以用来修改之间的内容;
- //Regex oEndFile = new Regex("", 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("");
- // int epos = szCompleteBuffer.IndexOf("",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" ?>
-
-
-
- ~/(\d{4})/(\d{2})\.html
- ~/(\d{4})/(\d{2})/
- ~/(\d{4})/(\d{2})
- ~/(\d{4})/(\d{2})/index.html
-
- ~/Pro.aspx?year=$1&month=$2
-
-
-
- ~/pc
-
- ~/Test2.aspx
-
-
复制代码 //这个规则写的不好,如第一个就可以用一个正则表达式来做。但是一时不知道怎么写好,好像要用到什么反捕获组的概念,正在思考这个东东!! |
|