var original = "АБ";
var query = HttpUtility.ParseQueryString("");
query["Arg"] = original;
var tmp1 = query.ToString();
上面的代码(这是构建查询字符串的推荐方法)将参数编码为
Arg=%u0410%u0411
但是,目标api不接受此参数,并要求以这种方式对其进行编码:
Arg=%D0%90%D0%91
是否可以使HttpValueCollection使用此编码?
最佳答案
HttpValueCollection的源代码中有一条注释解释了您的问题:
// DevDiv #762975: <form action> and other similar URLs are mangled since we use non-standard %uXXXX encoding.
// We need to use standard UTF8 encoding for modern browsers to understand the URLs.
https://referencesource.microsoft.com/#System.Web/HttpValueCollection.cs,9938b1dbd553e753,references
看起来这个行为可以通过web.config中的appsetting来控制。要获得所需的行为,请添加以下内容:
<add key="aspnet:DontUsePercentUUrlEncoding" value="true" />
如果目标是.NET 4.5.2+,则默认情况下应将此值设置为true。
您可以在
System.Net.Http
命名空间中的FormUrlEncodedContent 类中使用。下面是一个如何做到这一点的示例:string query;
using (var content = new FormUrlEncodedContent(new KeyValuePair<string, string>[]{
new KeyValuePair<string, string>("Arg", "АБ")
}))
{
query = content.ReadAsStringAsync().Result;
}
Console.WriteLine(query);
你也可以在谷歌上搜索“QueryStringBuilderC”来查看其他人提出的解决方案。