您的位置:首页 > 编程语言 > ASP

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

2010-01-14 00:00 721 查看
然而手机客户端又不支持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; 
} 
} 
} 
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: