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();
}
}
我有一个自定义 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();
}
}