更改HttpValueCollection如何编码参数的方式

时间:2018-03-27 18:12:14

标签: c# .net http web

var original = "АБ";

var query = HttpUtility.ParseQueryString("");
query["Arg"] = original;
var tmp1 = query.ToString();

上面的代码(建议构建查询字符串的方法)将参数编码为Arg=%u0410%u0411
但是,目标API不接受此参数,并要求以这种方式对其进行编码:Arg=%D0%90%D0%91
是否可以使HttpValueCollection使用此编码?

2 个答案:

答案 0 :(得分:1)

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);

此外,您可以谷歌“查询字符串构建器c#”解决其他人提出的解决方案。

答案 1 :(得分:0)

MVC使用UTF-8进行编码,您的要求使用其他代码页。

只需使用带有Encoding参数的重载(您需要选择所需的编码,有关列表,请参阅here

Encoding encoding = Encoding.GetEncoding(1252);
HttpUtility.ParseQueryString(string, encoding);

MSDN