2014-01-21 2 views
4

У меня есть этот код, который отлично работает в .NET 4.5.Код понижающего кода для HttpClient .NET 4.5 до .NET 4.0

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.

enter image description here

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

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

+0

[HttpClient] (http://msdn.microsoft.com/en -us/library/system.net.http.httpclient% 28v = vs.110% 29.aspx) является новым для 4.5, поэтому вы не можете его понизить, вам нужно будет использовать diffrent-класс. –

+2

@ScottChamberlain Спасибо! Не могли бы вы предложить, что мне нужно использовать, пожалуйста? –

ответ

7

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

+1

Я знаю, но мне нужно отправить строку JSON, вот что я делаю здесь клиент.PostAsJsonAsync («api/Account/Login», loginBindingModel); –

+2

Я считаю, что мы используем «Microsoft HTTP Client Libraries» Microsoft.Net.Http ver 2.2.18 (через NuGet), чтобы использовать client.PostAsJsonAsync из таргетинга приложений .net 4.0 – Wonderbird

+1

Я только что установил https: //www.nuget .org/packages/Microsoft.Net.Http и вообще не имеет PostAsJsonAsync. Вы уверены, что этот метод? Взгляните на изображение, которое я только что опубликовал в своем ответе. –

3

Просто для тех, кто ищет то же самое чистое решение .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/ЖДЕТ для .NET 4.0 вы должны установить Microsoft.BCL DLL и использовать асинхронную версию HttpClient, а также.

2

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

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 объект из моего пользовательского объекта.

Так

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

Становится (Примечание я использовал Json.NET here)

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

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

Смежные вопросы