Я работаю над клиентским приложением, которое использует спокойный сервис для поиска компаний по названию.
Важно, чтобы я мог включать буквальные амперсанды в свои запросы, поскольку этот символ довольно часто встречается в названиях компаний.
Однако всякий раз, когда я передаю% 26 (URI экранированный символ амперсанда) в System.Uri
, он преобразует его обратно в обычный символ амперсанда! При ближайшем рассмотрении единственными двумя символами, которые не преобразованы обратно, являются хеш (% 23) и процент (% 25).
Допустим, я хочу найти компанию под названием "Pierce & Pierce":
var endPoint = "http://localhost/companies?where=Name eq '{0}'";
var name = "Pierce & Pierce";
Console.WriteLine(new Uri(string.Format(endPoint, name)));
Console.WriteLine(new Uri(string.Format(endPoint, name.Replace("&", "%26"))));
Console.WriteLine(new Uri(string.Format(endPoint, Uri.EscapeUriString(name))));
Console.WriteLine(new Uri(string.Format(endPoint, Uri.EscapeDataString(name))));
Возвращаются все четыре из вышеперечисленных комбинаций:
http://localhost/companies?where=Name eq 'Pierce & Pierce'
Это приводит к ошибкам на стороне сервера, поскольку амперсанд (правильно) интерпретируется как разделитель аргументов запроса. Мне действительно нужно вернуть исходную строку:
http://localhost/companies?where=Name eq 'Pierce %26 Pierce'
Как я могу обойти это поведение, не отбрасывая System.Uri
полностью?
Я не могу заменить все амперсанды на% 26 в последний момент, потому что обычно используется несколько аргументов запроса, и я не хочу уничтожать их разделители.
Примечание: Подобная проблема обсуждалась в в этом вопросе , но я специально имею в виду System.Uri
.