繁体   English   中英

将HttpClient .NET 4.5的代码降级为.NET 4.0

[英]Downgrade code of HttpClient .NET 4.5 to .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客户端内请求...伙计们,我不知道我能做些什么来存档相同的功能......

请帮忙!

建议使用BCL / async /“Microsoft HTTP Client Libraries”帮助程序项目“补充”.Net 4.0与.Net 4.5具有相同的功能(可以在NuGet包管理器中找到最新版本。)有关详细信息,请参阅以下链接: http://www.nuget.org/packages/microsoft.bcl.async (注意:您可以通过相同的基本机制获得对http客户端的支持)

对于那些正在寻找相同.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 for .NET 4.0,则必须安装Microsoft.BCL dll并使用HttpClient的异步版本

即使安装了以下软件包,我也会遇到其他错误。

Install-Package Microsoft.Net.Http

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

结果Install-Package System.Net.Http.Formatting.Extension安装不支持dot net 4的system.net版本。所以我必须坚持PostAsync并从我的自定义对象创建一个httpContent对象。

所以

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM