现在我们团队在开发手机站,当中遇到一个问题.就是每张页面得传一个参数,而这个参数又不是从固定的页面进来的,也就是说无论从哪张页面进来,参数都要全站点的页面传下去,目前找不到解决办法.从网上down了一篇代码,可是RegexResource.ACTION,RegexResource.HREF报错,麻烦高手帮忙解决一下.下面我把代码贴上,小弟跪谢...
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; } } }}
8 回答
千巷猫影
TA贡献1829条经验 获得超7个赞
无论从哪张页面进来,参数都要全站点的页面传下去
既然是这样的话楼主为什么非要使用url传参来实现呢,定义全局变量,或者使用Session来存储要传递的参数岂不是更好?
MYYA
TA贡献1868条经验 获得超4个赞
由于我们这个项目是用于手机的,如果用session的话是可以保存参数的值,但是用户保存的页面的路径中没有这个参数的话,他下一次用这个路径来登的话那我们就永远取不到值的.
杨魅力
TA贡献1811条经验 获得超6个赞
根据你的需求
目前用Global.cs处理相对简单,引入也方便,具体步骤和原理和和httpmodule一致如下:
1:截取输出前的内容文本
2:正则取出所有href的链接
3:循环替换href的链接
4:输出到客户端
这里有两篇文章:是处理页面标题的,不过方式是一致的,只是需要处理的正则需要发现点变化:
- 8 回答
- 0 关注
- 423 浏览
添加回答
举报
0/150
提交
取消