あなたの問題は&
、クエリ文字列で特別な意味を持つことです。つまり、引数を分離することです。知覚されたパラメータの&
真ん中は、実際には引数セパレータとして解析されています。URL を構成するときに URL エンコードする必要があります。artist
&
たとえば、1 つの正しいクエリ文字列は次のようになります。
?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());
}
つまり、クエリ文字列を解析しようとしているときではなく、クエリ文字列を作成するときに問題が発生しています。解析すると、意味的に正しくないクエリ文字列が既にあります。この時点でできることは何もありません。