QueryString、Form表单的高效解析

HttpContent提供了ReadAsFormDataAsync()方法,实际开发中的拦截器、等常常产生重置Request流的需求,自定义解析方法如下,测试效率还算不错,字符串分切比原生读取快,自定义方法是线性时间算法,进一步提高的了效率。 
public static NameValueCollection FormResolveCustom(String reqStr)
{
    NameValueCollection form = new NameValueCollection(8);
    Char[] split = { '=' };
    String[] forms = reqStr.Split('&');

    for (Int32 i = 0; i < forms.Length; i++)
    {
        String[] kvp = forms[i].Split(split, 2, StringSplitOptions.RemoveEmptyEntries);
        if (kvp.Length == 2)
        {
            form.Add(kvp[0], HttpUtility.UrlDecode(kvp[1]));
        }
        else if (kvp.Length == 1)
        {
            form.Add(kvp[0], null);
        }
    }
    return form;
}

public static NameValueCollection FormResolvePro(String reqStr)
{
    NameValueCollection form = new NameValueCollection(8);
    Int32 eq = 0;
    Int32 at = 0;

    for (Int32 i = 0; i < reqStr.Length; i++)
    {
        if (reqStr[i] == '=')
        {
            at = i;
        }
        else if (reqStr[i] == '&' || i == reqStr.Length - 1)
        {
            Int32 valueLength = i - at - 1;
            if (i == reqStr.Length - 1)
            {
                valueLength++;
            }

            if (at > eq && valueLength > 0)
            {
                String name = HttpUtility.UrlDecode(reqStr.Substring(eq, at - eq));
                String value = HttpUtility.UrlDecode(reqStr.Substring(at + 1, valueLength));

                if (!String.IsNullOrWhiteSpace(name))
                {
                    form.Add(name, value);
                }
            }
            eq = i + 1;
            at = i + 1;
        }
    }
    return form;
}

转载于:https://www.cnblogs.com/Jusfr/archive/2013/03/08/2950273.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值