MK-Gii Ответов: 1

Класс .NET uri искажает URL-адреса


эй,

У меня очень странная проблема с классом Uri.
При формировании URL-адресов, имеющих значения строки запроса, закодированные 2 раза-это показывает правильно. В нем параметры кодируются один раз-свои .Сеть, кажется, автоматически расшифровывает их. Этот вид делает Uri содержащим недопустимый url-адрес.

Например, у меня есть 2 url-адреса:
http://www.google.com/China?depCity=%25E5%259D%258E%25E6%2598%2586
http://www.google.com/China?depCity%3d%e5%9d%8e%e6%98%86


Если я создам Bew Uri, передав URL-адреса в новый Uri(urlString), это даст мне такой результат:
http://www.google.com/China?depCity=%25E5%259D%258E%25E6%2598%2586"
http://www.google.com/China?depCity=坎昆


Так что в принципе-вместо того, чтобы делать запрос к url-адресу, который я отправляю, он делает запрос к декодированному url-адресу, который я отправил. Я пробовал отслеживать это с помощью fiddler, и он показывает "??? " вместо китайских иероглифов.

Теперь-мне нужен Uri, чтобы сделать url-адрес таким, как он есть, не делая "волшебного декодирования всякий раз, когда я хочу", потому что это делает ссылку недействительной и запрос терпит неудачу.
У кого-нибудь есть какие-нибудь мысли на этот счет?

ОБНОВЛЕНИЕ
Вот еще кое-что на эту тему:
string originalURL_1 = "http://www.google.com/China?depCity%3d%e5%9d%8e%e6%98%86";
Uri uri1 = new Uri(originalURL_1, true);
Uri uri2 = new Uri(originalURL_1, false);


Теперь-это было запущено с использованием .NET 4.5 и выше, результаты выглядят следующим образом:
uri1.AbsoluteUri = http://www.google.com/China?depCity%3d坎昆
uri2.AbsoluteUri = http://www.google.com/China?depCity%3d%E5%9D%8E%E6%98%86


Использование .NET 4.0 и ниже:
uri1.AbsoluteUri = http://www.google.com/China?depCity%3d%E5%9D%8E%E6%98%86
uri2.AbsoluteUri = http://www.google.com/China?depCity%3d%E5%9D%8E%E6%98%86


Кроме того, при использовании необязательного параметра для dontEscape он показывает предупреждение о том, что он устарел и всегда ложен, но на самом деле это ложь. Где-то в классе Uri есть недостаток, поэтому на данный момент кажется, что единственный способ делать запросы-это передавать строку вместо Uri.

Спасибо!

Что я уже пробовал:

попробовал использовать новый Uri(urlString, true), чтобы он не выходил из url-адреса, но он игнорирует его и все равно разрушает ссылки.

Richard Deeming

Использование .NET 4.6.2, new Uri(originalURL_1).AbsoluteUri возвращается http://www.google.com/China?depCity%3d%E5%9D%8E%E6%98%86 как и ожидалось.

MK-Gii

попробуйте передать true/false в качестве дополнительного параметра. В сообщении говорится, что это устарело и всегда по умолчанию имеет значение "false". Но это не так.

1 Ответов

Рейтинг:
0

MK-Gii

передача значения перечисления UriKind, по-видимому, устраняет проблему. Так что просто нужно было держаться подальше от передачи в true/false для encodeQuery и вместо этого передавать в "UriKind.Абсолютный".