使用 UrlRewritingNet 完成 Url Friendly。
但是在与Ajax(atlas)进行配合时,碰到了问题,Ajax调用后会回写Form的Action导致,Ajax的下一次调用失败。Google后,找到了几短代码,整合了以下进行解决。
需要在两处进行修改
1 处理 page的render, 将Action修改为Request.RawUrl (重写前的Url)
public class RewriteActionPage : System.Web.UI.Page
{
/// <summary>
/// 重写默认的HtmlTextWriter方法,修改form标记中的value属性,使其值为重写的URL而不是真实URL。
/// </summary>
/// <param name="writer"></param>
protected override void Render(HtmlTextWriter writer)
{
if (writer is System.Web.UI.Html32TextWriter)
{
writer = new FormFixerHtml32TextWriter(writer.InnerWriter);
}
else
{
writer = new FormFixerHtmlTextWriter(writer.InnerWriter);
}
base.Render(writer);
}
}
internal class FormFixerHtml32TextWriter : System.Web.UI.Html32TextWriter
{
private string _url; // 假的URL
internal FormFixerHtml32TextWriter(TextWriter writer)
: base(writer)
{
_url = HttpContext.Current.Request.RawUrl;
}
public override void WriteAttribute(string name, string value, bool encode)
{
// 如果当前输出的属性为form标记的action属性,则将其值替换为重写后的虚假URL
if (_url != null && string.Compare(name, "action", true) == 0)
{
value = _url;
}
base.WriteAttribute(name, value, encode);
}
}
internal class FormFixerHtmlTextWriter : System.Web.UI.HtmlTextWriter
{
private string _url;
internal FormFixerHtmlTextWriter(TextWriter writer)
: base(writer)
{
_url = HttpContext.Current.Request.RawUrl;
}
public override void WriteAttribute(string name, string value, bool encode)
{
if (_url != null && string.Compare(name, "action", true) == 0)
{
value = _url;
}
base.WriteAttribute(name, value, encode);
}
}
2 修改UrlRewriteModule
public class UrlRewriteModule : IHttpModule, IRawPath
{
....
private string _rawPath = "";
public string GetPath()
{
return _rawPath;
}
public void Init(System.Web.HttpApplication context)
{
....
context.ReleaseRequestState += new EventHandler(InstallResponseFilter);
}
private void InstallResponseFilter(object sender, EventArgs e)
{
HttpResponse response = HttpContext.Current.Response;
if (response.ContentType == "text/plain")
{
AjaxPageFilter filter = new AjaxPageFilter(response.Filter);
response.Filter = filter;
filter.RawPath = this;
}
}
private void OnBeginRequest(object sender, EventArgs e)
{
....
_rawPath = app.Request.RawUrl;
}
}
//
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Web;
namespace UrlRewritingNet.Web.Ajax
{
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;
}
}
}
}
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Web;
namespace UrlRewritingNet.Web.Ajax
{
public interface IRawPath
{
string GetPath();
}
}
但是在与Ajax(atlas)进行配合时,碰到了问题,Ajax调用后会回写Form的Action导致,Ajax的下一次调用失败。Google后,找到了几短代码,整合了以下进行解决。
需要在两处进行修改
1 处理 page的render, 将Action修改为Request.RawUrl (重写前的Url)
public class RewriteActionPage : System.Web.UI.Page
{
/// <summary>
/// 重写默认的HtmlTextWriter方法,修改form标记中的value属性,使其值为重写的URL而不是真实URL。
/// </summary>
/// <param name="writer"></param>
protected override void Render(HtmlTextWriter writer)
{
if (writer is System.Web.UI.Html32TextWriter)
{
writer = new FormFixerHtml32TextWriter(writer.InnerWriter);
}
else
{
writer = new FormFixerHtmlTextWriter(writer.InnerWriter);
}
base.Render(writer);
}
}
internal class FormFixerHtml32TextWriter : System.Web.UI.Html32TextWriter
{
private string _url; // 假的URL
internal FormFixerHtml32TextWriter(TextWriter writer)
: base(writer)
{
_url = HttpContext.Current.Request.RawUrl;
}
public override void WriteAttribute(string name, string value, bool encode)
{
// 如果当前输出的属性为form标记的action属性,则将其值替换为重写后的虚假URL
if (_url != null && string.Compare(name, "action", true) == 0)
{
value = _url;
}
base.WriteAttribute(name, value, encode);
}
}
internal class FormFixerHtmlTextWriter : System.Web.UI.HtmlTextWriter
{
private string _url;
internal FormFixerHtmlTextWriter(TextWriter writer)
: base(writer)
{
_url = HttpContext.Current.Request.RawUrl;
}
public override void WriteAttribute(string name, string value, bool encode)
{
if (_url != null && string.Compare(name, "action", true) == 0)
{
value = _url;
}
base.WriteAttribute(name, value, encode);
}
}
2 修改UrlRewriteModule
public class UrlRewriteModule : IHttpModule, IRawPath
{
....
private string _rawPath = "";
public string GetPath()
{
return _rawPath;
}
public void Init(System.Web.HttpApplication context)
{
....
context.ReleaseRequestState += new EventHandler(InstallResponseFilter);
}
private void InstallResponseFilter(object sender, EventArgs e)
{
HttpResponse response = HttpContext.Current.Response;
if (response.ContentType == "text/plain")
{
AjaxPageFilter filter = new AjaxPageFilter(response.Filter);
response.Filter = filter;
filter.RawPath = this;
}
}
private void OnBeginRequest(object sender, EventArgs e)
{
....
_rawPath = app.Request.RawUrl;
}
}
//
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Web;
namespace UrlRewritingNet.Web.Ajax
{
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;
}
}
}
}
using System;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
using System.Web;
namespace UrlRewritingNet.Web.Ajax
{
public interface IRawPath
{
string GetPath();
}
}