Предположим, я хочу создать объект 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, который сохраняет исходный кодированный параметр?
В .NET4 вы можете отключить сжатие Uri для определенной схемы через конфигурацию :
<configuration> <uri> <schemeSettings> <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes"/> </schemeSettings> </uri> </configuration>
Обратите внимание, что существуют ограничения безопасности, связанные с отключением поведения по умолчанию.
Как вы "получили" URL?Если навести курсор мыши на него в Visual Studio, он действительно показывает декодированный URL-адрес.
Но всякий раз, когда я обращаюсь к нему через свойство AbsoluteUri, он показывает закодированный URL-адрес.
AbsoluteUri
Это поведение задокументировано :
В рамках канонизации в конструкторе для некоторых схем экранированные представления уплотняются.Схемы, для которых URI будет уплотнять экранированные последовательности, включают следующее: file, http, https, net.pipe и net.tcp.Для всех других схем экранированные последовательности не уплотняются.Например: если вы в процентах закодируете две точки «..» как «% 2E% 2E», тогда конструктор URI сожмет эту последовательность для некоторых схем.Например, в следующем примере кода показан конструктор URI для схемы http.
Таким образом, один из обходных путей может временно использовать пользовательскую схему (например, leavemealone://) для создания объектов URL (возможно, через UriBuilder?).
leavemealone://
UriBuilder
В моем случае я решил эту проблему, возвращая метод ToString () класса UriBuilder вместо использования свойства Uri того же класса.