因为自己现在所在项目中很多url传值的地方都没有将值经过Server.UrlEncode编码而直接传值,所以造成在传值的时候存在大量错误。比如值中存在汉字,或者存在+,/等特殊符号时,接收到的值就和原来的传的值不一样了。所以我们在url传值时一定要将值经UrlEncode编码后再传,url的编码可参看本站:
Url编码与解码分析但现在项目中已经存在大量的没有编码的情况该怎么办呢?一个一个去改的话,总会存一些没有改到的地方。所以打算添加IhttpModel类,在HTTP执行管线链中的第一个事件BeginRequest中对未编码的url参数进行编码。
示例如下:
注:本示例只起一个引子的作用,未列出所有特殊符号的替换。
我们在下面的示例中演示将url中的+号替换成"%2B"。因为直接传+号,接收到的值会是一个空格。
public class SHttpModule : IHttpModule
{
private List<Pair> _encodelist;
/// <summary>
/// 须经url编码的字符
/// </summary>
public List<Pair> EncodeList
{
get
{
if (_encodelist == null)
{
_encodelist = new List<Pair>();
}
//在这个list中可以添加更多的须编码的字符
_encodelist.Add(new Pair("+", "%2B"));
return _encodelist;
}
}
public void Init(
HttpApplication HttpApplication)
{
//BeginRequest事件为http执行管线链中第一个发生的事件,在这个事情中,我们可以将未经编码的特殊字符替代成编码后的字符,然后利用RewritePath方法重写url地址。
HttpApplication.BeginRequest += new EventHandler(HttpApplication_BeginRequest);
}
void HttpApplication_BeginRequest(object sender, EventArgs e)
{
HttpApplication Application = (HttpApplication)sender;
HttpContext context = Application.Context;
string path = Application.Request.Url.PathAndQuery;
//因为url中的#有着特殊的意思,它代替页面将跳转到指定的锚文本上。所以在没有锚文本的情况下,是不应该出现#符号的。
if (path.Contains("#"))
{
context.RewritePath("/出错页面");
}
bool isEncode = false;
if (!path.Contains("%"))
{
foreach (Pair p in EncodeList)
{
if (path.Contains(p.First.ToString()))
{
path = path.Replace(p.First.ToString(), p.Second.ToString());
isEncode = true;
}
}
if (isEncode)
{
context.RewritePath(path);
}
}
}
public void Dispose()
{
}
当然,该方法会存在一些缺陷,比如经过RewritePath重写的url地址后会明显加重服务器cpu的负担。还有可能造成页面回发错误。具体解决方法与HttpModule模块的注册请查看本站:
如何通过RewritePath方法重写Url地址实现伪静态