您的问题是&
在查询字符串中具有特殊含义,即分隔参数。在您感知的参数&
中间实际上被解析为参数分隔符。构建 URL 时需要对 URL 进行编码。artist
&
例如,一个正确的查询字符串是:
?artist=singer1+%26+singer2&song=name+song
(空格通常可以编码为+
或%20
,但这是另一个讨论的主题。)
您可以HttpUtility.UrlEncode()
在构建查询字符串组件时使用,以确保正确转义结果。例如,您可以像这样构建查询字符串:
static void Main()
{
var values = new NameValueCollection();
values["artist"] = "singer1 & singer2";
values["song"] = "name song";
Console.WriteLine(CreateQueryString(values));
}
static string CreateQueryString(NameValueCollection values)
{
if (values == null) { throw new ArgumentNullException("values"); }
return string.Join(
"&",
values.AllKeys.Select(key => HttpUtility.UrlEncode(key) + "=" +
HttpUtility.UrlEncode(values[key]))
.ToArray());
}
换句话说,问题发生在您构建查询字符串时,而不是在您尝试解析它时。解析它时,您已经有一个语义不正确的查询字符串;此时您无能为力。