2014-01-21 428 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客戶端庫」Microsoft.Net.Http版本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(); 
} 

如果你想使用異步使用/指日可待.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安裝不支持點網4。所以我必須堅持PostAsync,並創建我的自定義對象的httpContent對象system.net的版本。

所以

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))