Я подумал, что описание поведения было немного странным, поэтому я решил проверить это для себя, и действительно, в .NET Framework 4.5.1 и 4.7.1, %3A
декодируется как :
HttpRequestMessage
класс.
.NET 4.5.1:

.NET 4.7.1:

Однако в .NET Core 2.1.401 такое же поведение не возникает при сохранении исходной строки.
.NET Core 2.1.401:

Поэтому, скорее всего, это ошибка с реализацией HttpRequestMessage
в .NET Framework, которая не была скопирована в .NET Core (которая полностью переписана).
У меня нет времени, чтобы сделать это самому, но я бы порекомендовал исправить ошибку в .NET Framework GitHub проекте , ссылаясь на этот пост переполнения стека.
Вы также можете опубликовать свою проблему в .NET Developer Community , чтобы также получить некоторые предложения и обходные пути.
Кроме того, я не могу думать ни о каком обходном пути к вашей проблеме.
ОБНОВЛЕНИЕ 1:
Как раз когда я собирался перейти к чему-то другому, я понял, что это класс System.Uri
, который фактически делает эту ошибку при выполнении ToString()
.
В качестве примера возьмем следующий код:
Uri uri = new Uri("https://example.com/?var=a%3Ab%3Dc%26d%3Fe");
var original = uri.OriginalString;
var toString = uri.ToString();
При выполнении в .NET Framework:

Как видите, исходная строка верна, но результат ToString () неверен.
ОБНОВЛЕНИЕ 2:
Теперь, когда стало более очевидно, что происходит, я смог выкопать этот старый пост stackoverflow: System.Uri и закодированный двоеточие (:) и этот социальный MSDN пост . Оба были созданы довольно давно, и похоже, что команда .NET никогда не решила заняться этим. Я не могу добраться до ошибки Microsoft Connect, возникшей , откуда я могу узнать, к чему это привело, но проект .NET Framework GitHub и страницы сообщества разработчиков .NET по-прежнему могут быть лучшими местами для получения ответ от команды .NET напрямую. (Социальный MSDN-сайт, в основном, не принадлежит Microsoft, поэтому не будет таким полезным).