Uri.EscapeUriString с квадратными скобками

Что-то странное, но давайте посмотрим, какой ответ он получит...

Если я закодирую консольное приложение (VS 2013,.NET 4.5.1) и выполните эту строку кода:

Uri.EscapeUriString("[")

Я получаю это:

[

Однако, если я выполняю ту же самую вещь (ну, технически Uri.EscapeUriString("[").Dump()) в LINQPad на моей машине, я получаю следующее:

%5B

Чтобы еще больше усложнить ситуацию, в соответствии с этим сообщением Uri.EscapeUriString("[") действительно должен вернуться %5B. Сообщение было написано 27/06/2012.

Я думаю, что LINQPad ссылается на более старую DLL, чем на VS, но это подразумевает, что EscapeUriString изменилось сравнительно недавно, и я не могу найти никаких записей. Кто-нибудь имеет какие-либо идеи относительно того, что может вызвать такое поведение?

Ответ 1

Это изменилось между .Net 4 и .Net 4.5, которое вы можете проверить, переназначив версию фрейма на .Net 4 и запустив тестовую программу.

.Net 4 → выходы "% 5B" .net 4.5 (или более поздняя версия) → выходы "["

Здесь упоминается: Совместимость приложений в .NET Framework 4.5

в разделе Uri.EscapeDataString, Uri.EscapeUriString и Uri.UnescapeDataString, в котором указано, что (с .Net 4.5):

Список зарезервированных и незарезервированных символов теперь поддерживает RFC 3986.

Конкретные изменения:

Unreserved escaped characters are un-escaped.
EscapeDataString escapes reserved characters based on RFC 3986.
EscapeUriString does not escape reserved characters.
UnescapeDataString does not throw an exception if it encounters an invalid escape sequence.

В частности, EscapeUriString не избегает зарезервированных символов, которые являются значительными.

Ответ 2

Новое поведение кажется правильным в соответствии с RFC 2396. В строке 566 указано:

566.    Other characters are excluded because gateways and other transport
567.    agents are known to sometimes modify such characters, or they are
568.    used as delimiters.
569. 
570.    unwise      = "{" | "}" | "|" | "\" | "^" | "[" | "]" | "`"

В документации Uri.EscapeUriString указано, что

По умолчанию метод EscapeUriString преобразует все символы, за исключением безоговорочных символов RFC 2396, в их шестнадцатеричное представление

Таким образом, казалось бы, произошла ошибка в .NET 4.0, которая была исправлена ​​в версии 4.5.1