工欲善其事,必先利其器,追求深透.Net

 

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

由于项目中有许多页面需要用到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 { getset; }
            
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"&amp;cid=" + HttpContext.Current.Request["cid"]);
                }

                
return result;
            }
        }
    }
}

 

 

posted on 2010-01-13 16:30  Jess5  阅读(712)  评论(1编辑  收藏  举报

导航