蝈蝈俊.net

-- 用随笔来记录自己的技术感触
随笔 - 672, 评论 - 4312, 引用 - 276

导航

关于

记录自己的技术心得

标签

每月存档

最新留言

  • re:搜索引擎优化的一些基础知识
    关于SEO,软文还是很重要的. 曾经看到过最强的一软文就是一个网络公司组织学习甲流,当时这是热门词.
    by 修罗(匿名) on 2010/3/16 22:25:45
  • re:搜索引擎优化的一些基础知识
    支持。
    by 健康(匿名) on 2010/3/16 15:33:17
  • xlourMhPIOOsbKYhR
    HARD2r <a href="http://zsatvcilmzmy.com/">zsatvcilmzmy</a&am...
    by vvskyhlm(匿名) on 2010/3/16 14:27:09
  • gGXdJKzaRDyBqOjACcn
    64SfJp <a href="http://wuqehqzgyspi.com/">wuqehqzgyspi</a&am...
    by mjpabnnw(匿名) on 2010/3/16 14:26:20
  • re:学习笔记:7种结构型设计模式简单对比
    [url=http://www.szvelcro.com]魔术贴[/url] [url=http://www.szvelcro.com]背胶魔术贴[/url] [url=http://www.sz...
    by dsds(匿名) on 2010/3/16 11:04:24
  • Linkz
    comment2, http://axure.com/cs/members/wifelovers.aspx angel wifelovers, nilzom, http://axure.com/cs...
    by red tube top(匿名) on 2010/3/15 17:05:45
  • re:我所期待的2010年的QCon大会
    还是走技术路线强啊
    by 科士威(匿名) on 2010/3/15 8:44:22
  • 科士威购物网站
    <p>谢谢楼主分享,受教了</p>
    by winskyna(注册) on 2010/3/14 8:48:22
  • re:IP to Integer
    测试了C#方法,好像有点问题。 修改后方法: http://www.cnblogs.com/EasyData/archive/2010/01/28/1658845.html
    by 游客(匿名) on 2010/3/9 14:19:53
  • re:Silverlight 版的华容道游戏
    确实有难度。
    by 微笑的撒旦(匿名) on 2010/3/8 18:18:28

广告

 
在 System.Web 命名空间 下有个静态方法:

HttpUtility.ParseQueryString (String, Encoding)
使用指定的 Encoding 将查询字符串分析成一个 NameValueCollection。 
我们如下代码显示的是我们需要的东西:

string query = "?searchtype=1&bigclassid=0&searchKeys=123+456&author=&tabletype=now";
NameValueCollection nv = HttpUtility.ParseQueryString(query);
Console.WriteLine(nv["tabletype"]);

但是我们用 Reflector 去看这个函数的实现:
其中调用到了 System.Web.HttpValueCollection 类的
internal void FillFromString(string s, bool urlencoded, Encoding encoding); 方法

从 Reflector 看这个函数的实现如下:

internal void FillFromString(string s, bool urlencoded, Encoding encoding)
{
      int num1 = (s != null) ? s.Length : 0;
      for (int num2 = 0; num2 < num1; num2++)
      {
            int num3 = num2;
            int num4 = -1;
            while (num2 < num1)
            {
                  switch (s[num2])
                  {
                        case '=':
                              if (num4 < 0)
                              {
                                    num4 = num2;
                              }
                              break;
                  }
                  num2++;
            }
            string text1 = null;
            string text2 = null;
            if (num4 >= 0)
            {
                  text1 = s.Substring(num3, num4 - num3);
                  text2 = s.Substring(num4 + 1, (num2 - num4) - 1);
            }
            else
            {
                  text2 = s.Substring(num3, num2 - num3);
            }
            if (urlencoded)
            {
                  base.Add(HttpUtility.UrlDecode(text1, encoding), HttpUtility.UrlDecode(text2, encoding));
            }
            else
            {
                  base.Add(text1, text2);
            }
            if ((num2 == (num1 - 1)) && (s[num2] == '&'))
            {
                  base.Add(null, string.Empty);
            }
      }
}

 
分析代码我们就可以知道:它没有处理参数中,多个参数的问题。
如果我们把这个代码复制出来执行,它是无法把?searchtype=1&bigclassid=0&searchKeys=123+456&author=&tabletype=now 这样QueryString 中的后面几个参数解析出来的。

怪异的问题就在这里,
执行出来的效果是分析出来了,而分析代码却没有分析出来。


这个问题,也有其他人看到:
比如:http://codebetter.com/blogs/karlseguin/archive/2006/05/04/144052.aspx
不过他提供的解析函数,忽略考虑了一种情况:如果参数中出现如下的情况就会报错
from=/Expert/search.asp?bigclassid=61

所以我在用他的函数时候,对他的一个函数作了修改:
public static NameValueCollection ParseQueryString(string query, char delimiter)
{
    if (delimiter == '\0')
    {
        throw new ArgumentNullException("delimiter");
    }
    NameValueCollection queryString = new NameValueCollection();
    if (query == null || query.Length == 0)
    {
        return queryString;
    }
    if (query.StartsWith("?"))
    {
        query = query.Substring(1, query.Length - 1);
    }

    string[] pairs = query.Split(delimiter);
    foreach (string pair in pairs)
    {
        int tt = pair.IndexOf('=');
        if (tt <= 0)
            continue;

        string name = null, val = null;
        name = pair.Substring(0, tt);
        if (pair.Length > tt)
            val = pair.Substring(tt + 1);
        queryString.Add(name, val);
    }
    return queryString;
}    
    

至于 Reflector  分析出来的代码,经过请教几个牛人,最后认为是 Reflector  分析代码出错误了。出错就在 switch 函数那里,
1、 其中的 case '=': 的break 是退出 switch 而不是退出循环
2、 估计其中少了一个 case '&'
请教 装配脑袋 后,觉得正确地分析出来的代码应该是:

internal void FillFromString(string s, bool urlencoded, Encoding encoding)
{
    int num1 = (s != null) ? s.Length : 0;
    for (int num2 = 0; num2 < num1; num2++)
    {
        int num3 = num2;
        int num4 = -1;
        while (num2 < num1)
        {
            switch (s[num2])
            {
                case '=':
                    if (num4 < 0)
                    {
                        num4 = num2;
                    }
                    break;
                case '&':
                    goto BREAKWHILE;
            }
            num2++;
        }

        BREAKWHILE:
        string text1 = null;
        string text2 = null;
        if (num4 >= 0)
        {
            text1 = s.Substring(num3, num4 - num3);
            text2 = s.Substring(num4 + 1, (num2 - num4) - 1);
        }
        else
        {
            text2 = s.Substring(num3, num2 - num3);
        }
        if (urlencoded)
        {
            base.Add(HttpUtility.UrlDecode(text1, encoding), HttpUtility.UrlDecode(text2, encoding));
        }
        else
        {
            base.Add(text1, text2);
        }
        if ((num2 == (num1 - 1)) && (s[num2] == '&'))
        {
            base.Add(null, string.Empty);
        }
    }

}


打印 | 张贴于 2006-12-06 10:54:00 | Tag:.net 编程心得  技术随笔  VS2005相关

留言反馈

# 使用 Request.QueryString 接受参数时,跟编码有关的一些问题 编辑
我们先来看以下几个请求,看a.aspx页面用Request.QueryString接受到的是啥信息?页面URLRequest.QueryString[
2007-12-17 12:24:00 | [匿名:csdnexpert]
#使用 Request.QueryString 接受参数时,跟编码有关的一些问题 编辑

我们先来看以下几个请求,看a.aspx 页面用Request.QueryString接受到的是啥信息?

页面URL Request.QueryString[
2007-12-15 23:45:00 | [匿名:fredlau]
#回复: 使用 Reflector ; 查看代码时候,碰到的一个Reflector 的bug 编辑
经过强混淆的代码在Reflector里经常会出错显示不出
但运行都没问题的
2006-12-21 17:52:00 | [匿名:yezie]
对不起,目前本随笔不允许发表新评论.

Powered by: Joycode.MVC引擎 0.5.2.0