asp.net通过HttpModule自动在Url地址上添加参数

  然而手机客户端又不支持Session和Cookie传值,其他方法给页面赋值再传值显得太麻烦了,而且还不易维护,容易弄丢出错,于是想到了用HttpModule来把cid参数赋在Url地址上,让url把cid参数每页自动传递下去,需要用cid时只要通过Requet["cid"]获取,这样就不用为传值而烦恼了。

  以下是配置方法和源码。

  1)在web.config配置文件中添加以下节点

  

复制代码 代码如下:

  <httpModules>

  <add name="HttpModule" type="ThreeHegemony.Utility.AutoAddCid"/>

  </httpModules>

  2)通过继承IHttpModule来实现url传值。

  代码

  

复制代码 代码如下:

  using System;

  using System.Text;

  using System.Web;

  using System.IO;

  using System.Text.RegularExpressions;

  namespace ThreeHegemony.Utility

  {

  /// <summary>

  /// Auther: Jess.zou

  /// Create data: 2009-08-06

  /// Description: 该类作用在Url地址后自动添加(cid)

  /// </summary>

  public class AutoAddCid : System.Web.IHttpModule

  {

  public void Init(HttpApplication context)

  {

  context.PostRequestHandlerExecute += new EventHandler(this.OnPreSendRequestContent);

  }

  protected void OnPreSendRequestContent(Object sender, EventArgs e)

  {

  System.Web.HttpApplication myContext = (System.Web.HttpApplication)sender;

  myContext.Response.Filter = new AppendSIDFilter(myContext.Response.Filter);

  }

  private void ReUrl_BeginRequest(object sender, EventArgs e)

  {

  string cid = "";

  string url = "";

  HttpContext context = ((HttpApplication)sender).Context;

  if (string.IsNullOrEmpty(context.Request.QueryString["cid"]))

  {

  if (context.Request.QueryString.Count == 0)

  {

  url = string.Format("{0}?cid={1}", context.Request.RawUrl, cid);

  }

  else

  {

  url = string.Format("{0}&cid={1}", context.Request.RawUrl, cid);

  }

  }

  context.RewritePath(url);

  }

  public void Dispose() { }

  public class AppendSIDFilter : Stream

  {

  private Stream Sink { get; set; }

  private long _position;

  private System.Text.StringBuilder oOutput = new StringBuilder();

  public AppendSIDFilter(Stream sink)

  {

  Sink = sink;

  }

  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);

  }

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

  {

  if (string.IsNullOrEmpty(HttpContext.Current.Request["cid"]))

  {

  Sink.Write(buffer, 0, buffer.Length);

  return;

  }

  string content = System.Text.UTF8Encoding.UTF8.GetString(buffer, offset, count);

  Regex regex = new Regex(RegexResource.HREF, RegexOptions.IgnoreCase);

  Regex action_regex = new Regex(RegexResource.ACTION, RegexOptions.IgnoreCase);

  if (regex.IsMatch(content))

  {

  content = Regex.Replace(content, RegexResource.HREF, new MatchEvaluator(ReplaceSID), RegexOptions.Compiled | RegexOptions.IgnoreCase);

  }

  if (action_regex.IsMatch(content))

  {

  content = Regex.Replace(content, RegexResource.ACTION, new MatchEvaluator(ReplaceSID), RegexOptions.Compiled | RegexOptions.IgnoreCase);

  }

  byte[] data = System.Text.UTF8Encoding.UTF8.GetBytes(content);

  Sink.Write(data, 0, data.Length);

  }

  public static string ReplaceSID(Match match)

  {

  if (match.Value.IndexOf("cid=") != -1)

  {

  return match.Value;

  }

  string result;

  if (match.Value.IndexOf('?') == -1)

  {

  result = match.Value.Insert(match.Value.Length - 1, "?cid=" + HttpContext.Current.Request["cid"]);

  }

  else

  {

  result = match.Value.Insert(match.Value.Length - 1, "&cid=" + HttpContext.Current.Request["cid"]);

  }

  return result;

  }

  }

  }

  }