服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

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

2019-07-03 17:24服务器之家 ASP.NET教程

由于项目中有许多页面需要用到cid参数,所以想通过传值cid来获取数据。

然而手机客户端又不支持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; 



延伸 · 阅读

精彩推荐