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”来查看其他人提出的解决方案。

10-08 04:45