QueryBuilder 没有在查询参数中编码“@”,无论如何强制它?

QueryBuilder is not encoding `@` in query parameters, anyway to force it?

我有一个自定义 Web 服务,我使用 QueryBuilder 查询并提供电子邮件 (MyUser@MyDomain.com) 和广告帐户 (MyDomain\MyUser) 作为参数,但是当我这样做时 .ToQueryString()@符号没有编码?

有没有办法获得正确编码的字符串或它没有编码的原因?

QueryBuilder qb = new QueryBuilder();
qb.Add("adAccount", "MyDomain\MyUser");
qb.Add("email", "MyUser@MyDomain.com");

var queryString = qb.ToQueryString();

我上面的代码 returns (@):

?adAccount=MyDomain%5CMyUser&email=MyUser@MyDomain.com

但我希望 (%40):

?adAccount=MyDomain%5CMyUser&email=MyUser%40MyDomain.com

QueryBuilder 的源代码位于 here - 它并不复杂 class,基本上只是一个 List<KeyValuePair<string,string>> 在 key/values 被 ToString'd。它不是密封的,并且 ToString 是可覆盖的,因此您可以创建自己的版本,该版本将在任何需要 QueryBuilder 的地方工作:

class QueryBuilderEx : QueryBuilder
{
    public override string ToString()
    {
        return base.ToString().Replace("@", "%40");
    }
}

如果你只想编辑值,而不管键,那就有点麻烦了,因为你需要按照原始样式重新实现 ToString,但是 _params 中的列表存储的对是私有的,因此您的 subclass 无法访问。但是,您可以让 QueryBuilder 枚举自己:

class QueryBuilderEx : QueryBuilder
{
    public override string ToString()
    {
        var builder = new StringBuilder();
        bool first = true;
        foreach(var pair in this)
        {
            builder.Append(first ? '?' : '&');
            first = false;
            builder.Append(UrlEncoder.Default.Encode(pair.Key));
            builder.Append('=');
            builder.Append(UrlEncoder.Default.Encode(pair.Value).Replace("@", "%40"));
        }

        return builder.ToString();
    }
}