Сохраните экранированный Uri с помощью HttpClient

Я пытаюсь использовать HttpClient для создания запроса GET со следующим Uri:

http://test.com?action=enterorder&ordersource=acme&resid=urn%3Auuid%3A0c5eea50-9116-414e-8628-14b89849808d Как видите, остаточный параметр экранирован с помощью% 3A, то есть символа ":".

Когда я использую этот Uri в запросе HttpClient, URL-адрес становится:

http://test.com?action=enterorder&ordersource=acme&resid=urn:uuid:0c5eea50-9116-414e-8628-14b89849808d, и я получаю сообщение об ошибке от сервера, потому что ожидается% 3A.

Кто-нибудь знает, что делать, чтобы сохранить экранированный Uri при отправке запроса? Кажется, что HttpClient всегда неэкранировал символы в строке перед ее отправкой. Вот используемый код:

Uri uri = new Uri("http://test.com?action=enterorder&ordersource=acme&resid=urn%3Auuid%3A0c5eea50-9116-414e-8628-14b89849808d");
using (HttpClient client = new HttpClient())
{
   var resp = client.GetAsync(uri);
   if (resp.Result.IsSuccessStatusCode)
      {
        var responseContent = resp.Result.Content;
        string content = responseContent.ReadAsStringAsync().Result;
      }
}

person MissRaphie    schedule 06.08.2013    source источник
comment
Какую ошибку вы получаете? Нет причин, по которым сервер должен обрабатывать% 3A в URL-адресе, а не:   -  person Peter Ritchie    schedule 06.08.2013
comment
Это Adobe Content Server, установленный на сервере Apache. Я знаю, что это странная проблема, но ожидается, что вызов получит% 3A, а не:   -  person MissRaphie    schedule 06.08.2013
comment
Это все еще происходит, если вы используете строковую перегрузку GetAsync? client.GetAsync(uri.OriginalString);   -  person keyboardP    schedule 06.08.2013
comment
@keyboardP все еще не работает :( Спасибо за подсказку.   -  person MissRaphie    schedule 06.08.2013
comment
Где вы используете uri? Вы создаете его, но он никогда не используется. Вы пробовали client.GetAsync("http://test.com?action=enterorder&ordersource=acme&resid=urn%3Auuid%3A0c5eea50-9116-414e-8628-14b89849808d"?   -  person Peter Ritchie    schedule 06.08.2013
comment
@PeterRitchie Я отредактировал вопрос, чтобы добавить uri var. К сожалению, я попытался напрямую вставить строку uri, как вы предложили, но URL-адрес все равно был дешифрован.   -  person MissRaphie    schedule 06.08.2013
comment
Похоже на ошибку на сервере, потому что: и% 3A должны обрабатываться одинаково.   -  person Peter Ritchie    schedule 06.08.2013
comment
Прошло несколько лет, но сегодня мы столкнулись с этой проблемой. Есть ли у вас идеи, как это исправить сегодня? Мы используем .NET Core 2.0.   -  person Noel Widmer    schedule 23.08.2018
comment
Эта проблема решена в .NET Core 2.1.   -  person Noel Widmer    schedule 24.08.2018


Ответы (2)


Возможно, вы захотите протестировать в .NET 4.5, поскольку в синтаксический анализ Uri для экранированных символов внесено множество улучшений.

Вы также можете проверить этот вопрос SO: ПОЛУЧЕНИЕ URL-адреса с URL- закодированная косая черта, в которой опубликован хакерский прием, который можно использовать, чтобы не трогать URI.

person Glenn Block    schedule 25.12.2013
comment
Настройка в файле web.config, предложенная в одном из ответов на этот вопрос, - это то, что у меня сработало, к счастью, нет необходимости во взломах. <uri> <schemeSettings> <add name="http" genericUriParserOptions="DontUnescapePathDotsAndSlashes" /> </schemeSettings> </uri> - person MaQy; 21.01.2016

В качестве обходного пути вы можете попытаться снова закодировать эту часть URL-адреса, чтобы обойти проблему. % 3A станет% 253A

person Jens Elstner    schedule 06.08.2013