Как остановить HttpRequestMessage от декодирования% 3A до двоеточия в URI запроса (ядро asp.net) - PullRequest
0 голосов
/ 31 августа 2018

Используя этот код ...

using (HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, 
"https://example.com/?var=a%3Ab%3Dc%26d%3Fe")
{
    // Do stuff
}

... request.RequestUri теперь имеет значение "https://example.com/?var=a:b%3Dc%26d%3Fe"

Обратите внимание, что% 3A был не закодирован символом двоеточия, но все остальные закодированные символы остаются закодированными.

Как я могу предотвратить декодирование% 3A, как и всех других закодированных символов?

Для контекста я вызываю внешний API. Двоеточие выдает ошибку. У меня нет контроля над внешним API, поэтому мне нужно найти способ соответствовать ожиданиям API по кодированию.

1 Ответ

0 голосов
/ 31 августа 2018

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

.NET 4.5.1: dotnet 451 example

.NET 4.7.1: dotnet 471 example

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

.NET Core 2.1.401: dotnet core example

Поэтому, скорее всего, это ошибка с реализацией 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: uri.ToString()

Как видите, исходная строка верна, но результат ToString () неверен.

ОБНОВЛЕНИЕ 2:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...