2014-01-21 3 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에서 새로 도입되었으므로 다운 그레이드 할 수 없으므로 다른 클래스를 사용해야합니다. –

+2

@ScottChamberlain 감사합니다! 내가 무엇을 사용해야하는지 제안 해 줄 수 있니? –

답변

7

BCL/async/"Microsoft HTTP 클라이언트 라이브러리"도우미 프로젝트를 사용하여 .Net 4.5와 동일한 기능을 가진 .Net 4.0을 보완 할 것을 제안하십시오 (NuGet 패키지 관리자에서 최신 버전을 찾을 수 있음). 다음을 참조하십시오. 자세한 내용은 http://www.nuget.org/packages/microsoft.bcl.async (참고 : 동일한 기본 메커니즘을 통해 http 클라이언트에 대한 지원을받을 수 있습니다.)

+1

알아요.하지만 여기서 JSON 문자열을 보내야합니다.PostAsJsonAsync ("api/Account/Login", loginBindingModel); –

+2

앱 타겟팅에서 client.PostAsJsonAsync를 사용하기 위해 "Microsoft HTTP 클라이언트 라이브러리"Microsoft.Net.Http 버전 2.2.18 (NuGet을 통해)을 사용하고 있다고 생각합니다. – Wonderbird

+1

방금 ​​https : //www.nuget를 설치했습니다. .org/packages/Microsoft.Net.Http 그리고 PostAsJsonAsync가 전혀 없습니다. 그 방법이 있다고 확신합니까? 방금 내 대답에 게시 한 이미지를 살펴보십시오. –

3

동일한 .NET 4.0 순수 솔루션을 찾고있는 사용자의 경우 코드가 정상적으로 작동하는 것으로 나타났습니다. 그러나 구현해야하는 것은 ASYNC/AWAIT입니다. 어쨌든 그것은 질문에서 내 코드와 정확히 같은 방식으로 작동합니다. 당신이 사용 ASYNC를 사용하려면

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(); 
} 

는/당신이 Microsoft.BCL DLL을 설치뿐만 아니라 HttpClient를의 비동기 버전을 사용해야합니다 .NET 4.0 기다리고 있습니다.

2

다음 패키지를 설치 한 후에도 다른 오류가 발생했습니다.

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

Install-Package Microsoft.Net.Http

이 밝혀 Install-Package System.Net.Http.Formatting.Extension는 점 순 4. 그래서 PostAsync에 충실하고 내 사용자 지정 개체에서 httpContent 객체를 생성하는 지원하지 않습니다 system.net의 버전을 설치합니다.

그래서

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

이되다

public HttpContent CreateHttpContent(object data) 
     { 
      return new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json"); 
     } 
(나는 json.net here 사용 주)

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

관련 문제