Создание Uri в .NET автоматически кодирует все параметры из переданной строки - PullRequest
7 голосов
/ 05 сентября 2011

Предположим, я хочу создать объект Uri из следующей строки:

string url = @"http://someserver.com?param1=1&url=http%3a%2f%2fwww.otherserver.com";
Uri uri = new Uri(url, UriKind.Absolute);

Ожидаемый результат будет:

http://someserver.com?param1=1&url=http%3a%2f%2fwww.otherserver.com 

Получено:

http://someserver.com/?param1=1&url=http://www.otherserver.com

Такое же поведение замечено во многих связанных методах, которые позволяют создавать Uri: Uri.TryCreate, UriBuilder.Uri и т. Д.

Как получить Uri, который сохраняет исходный кодированный параметр?

Ответы [ 4 ]

6 голосов
/ 05 июня 2012

В .NET4 вы можете отключить сжатие Uri для определенной схемы через конфигурацию :

<configuration>
  <uri>
    <schemeSettings>
      <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes"/>
    </schemeSettings>
  </uri>
</configuration>

Обратите внимание, что существуют ограничения безопасности, связанные с отключением поведения по умолчанию.

4 голосов
/ 05 сентября 2011

Как вы "получили" URL?Если навести курсор мыши на него в Visual Studio, он действительно показывает декодированный URL-адрес.

Но всякий раз, когда я обращаюсь к нему через свойство AbsoluteUri, он показывает закодированный URL-адрес.

3 голосов
/ 05 сентября 2011

Это поведение задокументировано :

В рамках канонизации в конструкторе для некоторых схем экранированные представления уплотняются.Схемы, для которых URI будет уплотнять экранированные последовательности, включают следующее: file, http, https, net.pipe и net.tcp.Для всех других схем экранированные последовательности не уплотняются.Например: если вы в процентах закодируете две точки «..» как «% 2E% 2E», тогда конструктор URI сожмет эту последовательность для некоторых схем.Например, в следующем примере кода показан конструктор URI для схемы http.

Таким образом, один из обходных путей может временно использовать пользовательскую схему (например, leavemealone://) для создания объектов URL (возможно, через UriBuilder?).

0 голосов
/ 05 сентября 2011

В моем случае я решил эту проблему, возвращая метод ToString () класса UriBuilder вместо использования свойства Uri того же класса.

...