1.定义url重写规则,很不幸的是一定要使用特定字符替代&,郁闷ing.........
<UrlReWriter enabled="true" reverse="true">
<url pattern="/BBS/Forum/(d+).shtml" url="/BBS/Forum.aspx?BoardID=$1" repattern="/BBS/Forum.aspx?BoardID=(d+)$" reurl="/BBS/Forum/$1.shtml" />
<url pattern="/BBS/Post/(d+).shtml" url="/BBS/Post.aspx?ArticleID=$1" repattern="/BBS/Post.aspx?ArticleID=(d+)$" reurl="/BBS/Post/$1.shtml"></url>
<url pattern="/BBS/Forum/(d+)/(d+).shtml$" url="/BBS/Forum.aspx?BoardID=$1^type=$2" repattern="/BBS/Forum.aspx?BoardID=(d+)^type=(d+)$" reurl="/BBS/Forum/$1/$2.shtml" />
</UrlReWriter>
2.定义配置文件对应实体类
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Xml;
using System.Web.Caching;

namespace DuwCompontents
{
/// <summary>
/// url重写配置节实体类
/// </summary>
public class UrlReWriter
{
...

...

构造

}
/// <summary>
/// url重写配置实体类
/// </summary>
public class UrlReWriterConfig
{

私有成员

公有属性

单件模式
}
}
3.实现IHttpModule(不使用ajax.net(atlas)可以不用处理AjaxPageFilter相关)
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Xml;
using System.Text.RegularExpressions;

namespace DuwCompontents
{
public interface IRawPath
{
string GetPath();
}
public class DuwHttpModule : IHttpModule, IRawPath
{

IRawPath 成员
IHttpModule 成员

事件

}
}
4.配置IIS,主目录/配置,使用aspnet_isapi.dll处理.shtml.取消确认文件是否存在选择项
5,配置web.Config.支持自定义httpModule
<System.Web>
<httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<!--type="完全限定名,程序集"-->
<add name="DuwHttpModule" type="DuwCompontents.DuwHttpModule,DuwCompontents"/>
</httpModules>
</System.Web>
6重写page类
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using DuwCompontents;
using System.Text.RegularExpressions;
using System.IO;
using System.Web;

namespace DuwControls
{
public class DuwPage : Page
{


事件

支持URl正反向重写

}
}
7继续使用页面过滤器,使支持ajax.net(atlas)
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Web;

namespace DuwCompontents
{
public class AjaxPageFilter : Stream
{
IRawPath _context = null;
Stream responseStream;
long position;
StringBuilder responseHtml;

public AjaxPageFilter(Stream inputStream)
{
responseStream = inputStream;
responseHtml = new StringBuilder();
}

public override bool CanRead
{
get { return true; }
}

public override bool CanSeek
{
get { return true; }
}

public override bool CanWrite
{
get { return true; }
}

public override void Close()
{
responseStream.Close();
}

public override void Flush()
{
responseStream.Flush();
}

public override long Length
{
get { return 0; }
}

public override long Position
{
get { return position; }
set { position = value; }
}

public override long Seek(long offset, SeekOrigin origin)
{
return responseStream.Seek(offset, origin);
}

public override void SetLength(long length)
{
responseStream.SetLength(length);
}

public override int Read(byte[] buffer, int offset, int count)
{
return responseStream.Read(buffer, offset, count);
}

public override void Write(byte[] buffer, int offset, int count)
{
string finalHtml = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);

// Transform the response
string formAction = RawPath.GetPath();
if (!String.IsNullOrEmpty(formAction))
{
finalHtml = Regex.Replace(finalHtml, "/|/d+/|formAction/|/|[^/|]+/|",
"|" + formAction.Length.ToString() + "|formAction||" + formAction + "|",
RegexOptions.IgnoreCase);
}

// Write the response
byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(finalHtml);
responseStream.Write(data, 0, data.Length);
}

public IRawPath RawPath
{
get
{
return _context;
}
set
{
_context = value;

}
}
}
}
8.取消3(DuwHttpModule)中的注释,转而支持AjaxPageFilter,
至此url重写工作完成,但是反向匹配虽然可以使我们几乎不用改任何一句代码
就支持全站的url重写,却是一个很浪费资源的行为,并不建议使用
<UrlReWriter enabled="true" reverse="true">
<url pattern="/BBS/Forum/(d+).shtml" url="/BBS/Forum.aspx?BoardID=$1" repattern="/BBS/Forum.aspx?BoardID=(d+)$" reurl="/BBS/Forum/$1.shtml" />
<url pattern="/BBS/Post/(d+).shtml" url="/BBS/Post.aspx?ArticleID=$1" repattern="/BBS/Post.aspx?ArticleID=(d+)$" reurl="/BBS/Post/$1.shtml"></url>
<url pattern="/BBS/Forum/(d+)/(d+).shtml$" url="/BBS/Forum.aspx?BoardID=$1^type=$2" repattern="/BBS/Forum.aspx?BoardID=(d+)^type=(d+)$" reurl="/BBS/Forum/$1/$2.shtml" />
</UrlReWriter>2.定义配置文件对应实体类
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Xml;
using System.Web.Caching;
namespace DuwCompontents
{
/// <summary>
/// url重写配置节实体类
/// </summary>
public class UrlReWriter
{
...
...
构造
}
/// <summary>
/// url重写配置实体类
/// </summary>
public class UrlReWriterConfig
{
私有成员
公有属性
单件模式
}
}
3.实现IHttpModule(不使用ajax.net(atlas)可以不用处理AjaxPageFilter相关)
using System;
using System.Collections.Generic;
using System.Text;
using System.Web;
using System.Web.Security;
using System.Xml;
using System.Text.RegularExpressions;
namespace DuwCompontents
{
public interface IRawPath
{
string GetPath();
}
public class DuwHttpModule : IHttpModule, IRawPath
{
IRawPath 成员
IHttpModule 成员
事件
}
}4.配置IIS,主目录/配置,使用aspnet_isapi.dll处理.shtml.取消确认文件是否存在选择项
5,配置web.Config.支持自定义httpModule
<System.Web>
<httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=1.0.61025.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<!--type="完全限定名,程序集"-->
<add name="DuwHttpModule" type="DuwCompontents.DuwHttpModule,DuwCompontents"/>
</httpModules>
</System.Web>
6重写page类
using System;
using System.Collections.Generic;
using System.Text;
using System.Web.UI;
using System.Web.UI.WebControls;
using DuwCompontents;
using System.Text.RegularExpressions;
using System.IO;
using System.Web;
namespace DuwControls
{
public class DuwPage : Page
{

事件
支持URl正反向重写
}
}7继续使用页面过滤器,使支持ajax.net(atlas)
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Web;
namespace DuwCompontents
{
public class AjaxPageFilter : Stream
{
IRawPath _context = null;
Stream responseStream;
long position;
StringBuilder responseHtml;
public AjaxPageFilter(Stream inputStream)
{
responseStream = inputStream;
responseHtml = new StringBuilder();
}
public override bool CanRead
{
get { return true; }
}
public override bool CanSeek
{
get { return true; }
}
public override bool CanWrite
{
get { return true; }
}
public override void Close()
{
responseStream.Close();
}
public override void Flush()
{
responseStream.Flush();
}
public override long Length
{
get { return 0; }
}
public override long Position
{
get { return position; }
set { position = value; }
}
public override long Seek(long offset, SeekOrigin origin)
{
return responseStream.Seek(offset, origin);
}
public override void SetLength(long length)
{
responseStream.SetLength(length);
}
public override int Read(byte[] buffer, int offset, int count)
{
return responseStream.Read(buffer, offset, count);
}
public override void Write(byte[] buffer, int offset, int count)
{
string finalHtml = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);
// Transform the response
string formAction = RawPath.GetPath();
if (!String.IsNullOrEmpty(formAction))
{
finalHtml = Regex.Replace(finalHtml, "/|/d+/|formAction/|/|[^/|]+/|",
"|" + formAction.Length.ToString() + "|formAction||" + formAction + "|",
RegexOptions.IgnoreCase);
}
// Write the response
byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(finalHtml);
responseStream.Write(data, 0, data.Length);
}
public IRawPath RawPath
{
get
{
return _context;
}
set
{
_context = value;
}
}
}
}8.取消3(DuwHttpModule)中的注释,转而支持AjaxPageFilter,
至此url重写工作完成,但是反向匹配虽然可以使我们几乎不用改任何一句代码
就支持全站的url重写,却是一个很浪费资源的行为,并不建议使用
本文介绍了一个全面的URL重写方案,包括定义重写规则、配置实体类、实现HTTP模块、配置IIS及web.config,以及如何支持反向重写。

956

被折叠的 条评论
为什么被折叠?



