Код понижения версии HttpClient .NET 4.5 до .NET 4.0

У меня есть этот код, который отлично работает в .NET 4.5.

var handler = new HttpClientHandler();
handler.UseDefaultCredentials = true;
handler.PreAuthenticate = true;
handler.ClientCertificateOptions = ClientCertificateOption.Automatic;

var client = new HttpClient(handler);
client.BaseAddress = new Uri("http://localhost:22678/");
client.DefaultRequestHeaders.Accept.Add(
                    new MediaTypeWithQualityHeaderValue("application/json"));

var loginBindingModel = new LoginBindingModel { Password = "test01", UserName = "test01" };

var response = await client.PostAsJsonAsync("api/Account/Login", loginBindingModel);
                response.EnsureSuccessStatusCode(); // Throw on error code.
                tokenModel = await response.Content.ReadAsAsync<TokenModel>();

Теперь мне нужно сделать то же самое в .NET 4.0.

Но передо мной две проблемы, и я не знаю, как их решить.

  1. В .NET 4.0. метод client.PostAsJsonAsync не существует.
  2. Существующий метод - client.PostAsync, и ему требуется HttpContext.

введите описание изображения здесь

Я делаю запрос в клиенте WPF ... Ребята, я понятия не имею, что я могу сделать, чтобы заархивировать ту же функциональность ...

Пожалуйста помоги!


person DmitryBoyko    schedule 21.01.2014    source источник
comment
HttpClient является новым для 4.5, поэтому вы не можете понизить его версию, вам нужно будет использовать другой класс.   -  person Scott Chamberlain    schedule 21.01.2014
comment
@ScottChamberlain Спасибо! Не могли бы вы подсказать, что мне использовать?   -  person DmitryBoyko    schedule 21.01.2014


Ответы (3)


Предлагаем использовать вспомогательные проекты BCL / async / «Microsoft HTTP Client Libraries» для «дополнения» .Net 4.0 функциональностью, эквивалентной .Net 4.5 (последние версии можно найти в диспетчере пакетов NuGet). Дополнительные сведения см. По следующей ссылке: http://www.nuget.org/packages/microsoft.bcl.async (Примечание: вы можете получить поддержку http-клиента через тот же базовый механизм)

person Wonderbird    schedule 21.01.2014
comment
Я знаю, но мне нужно отправить строку JSON, что я и делаю здесь client.PostAsJsonAsync (api / Account / Login, loginBindingModel); - person DmitryBoyko; 21.01.2014
comment
Я считаю, что мы используем клиентские библиотеки Microsoft HTTP Microsoft.Net.Http версии 2.2.18 (через NuGet), чтобы использовать client.PostAsJsonAsync из приложения, ориентированного на .net 4.0. - person Wonderbird; 21.01.2014
comment
Я только что установил nuget.org/packages/Microsoft.Net.Http, и он вообще не имеет PostAsJsonAsync. Вы уверены, что у него есть такой метод? Взгляните на изображение, которое я только что опубликовал в своем ответе. - person DmitryBoyko; 21.01.2014
comment
Я только что дважды проверил один из проектов в нашем решении, который нацелен на .Net 4.0 и вызывает client.PostAsJsonAsync () Похоже, он обрабатывается с помощью метода расширения. Я подозреваю, что вам может понадобиться строка, использующая System.Net.Http.Formatting в модуле, выполняющем вызов. (Вы используете VS 2010 - в одной из заметок говорится, что VS2010 не поддерживается.) - person Wonderbird; 22.01.2014
comment
Спасибо за комментарии! Не могли бы вы помочь мне, как я могу использовать System.Net.Http.Formatting, в этом случае я не уверен ... - person DmitryBoyko; 22.01.2014
comment
После добавления клиентских библиотек Microsoft HTTP в ваш проект через NuGet просто убедитесь, что using System.Net.Http; и используя System.Net.Http.Formatting; находятся в верхней части исходного модуля, в котором есть вызов client.PostAsJsonAsync (). (Напишите мне, если вы все еще не видите его) - person Wonderbird; 22.01.2014
comment
System.Net.Http.Formatting, похоже, отсутствует в клиентских библиотеках Microsoft HTTP - person flexxxit; 27.02.2017

Как раз для тех, кто ищет такое же чистое решение .NET 4.0, я обнаружил, что этот код работает нормально. Но в нем нет ASYNC/AWAIT того, что нужно было бы реализовать. В любом случае он работает точно так же, как мой код в вопросе.

var webAddr = "http://localhost:22678/api/Account/Login";
var httpWebRequest = (HttpWebRequest)WebRequest.Create(webAddr);
httpWebRequest.ContentType = "application/json; charset=utf-8";
httpWebRequest.Method = "POST";

using (var streamWriter = new StreamWriter(httpWebRequest.GetRequestStream()))
{
      var loginBindingModel = new WebAPILoginBindingModel { Password = "test01", UserName = "test01" };
      var myJsonString = Newtonsoft.Json.JsonConvert.SerializeObject(loginBindingModel);
                    streamWriter.Write(myJsonString);
                    streamWriter.Flush();
}

var httpResponse = (HttpWebResponse)httpWebRequest.GetResponse();
using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
{
    var result = streamReader.ReadToEnd();
}

Если вы хотите использовать ASYNC / AWAIT для .NET 4.0, вам необходимо установить Microsoft.BCL dll, а также используйте асинхронные версии HttpClient.

person DmitryBoyko    schedule 22.01.2014

Даже после установки следующих пакетов у меня были другие ошибки.

Install-Package Microsoft.Net.Http

Install-Package System.Net.Http.Formatting.Extension

Оказывается, Install-Package System.Net.Http.Formatting.Extension устанавливает версию system.net, которая не поддерживает dot net 4. Поэтому я должен придерживаться PostAsync и создать объект httpContent из моего настраиваемого объекта.

So

PostAsJsonAsync("api/Account/Login", loginBindingModel)

Становится (обратите внимание, что я использовал json.net здесь)

public  HttpContent CreateHttpContent(object data)
        {  
            return new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
        }

PostAsync("api/Account/Login",CreateHttpContent(loginBindingModel))

person flexxxit    schedule 24.02.2017