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

6

我有一份在.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

enter image description here

我在WPF客户端内进行请求...伙计们,我不知道我该怎么做才能实现相同的功能...

请帮忙!


HttpClient 是4.5版本中新增的类,因此您无法将其降级,您需要使用另一个类。 - Scott Chamberlain
2
@ScottChamberlain 谢谢!您能建议我应该使用什么吗? - NoWar
3个回答

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

2
我相信我们正在使用“Microsoft HTTP Client Libraries” Microsoft.Net.Http ver 2.2.18(通过NuGet)来使用针对 .net 4.0 应用程序的 client.PostAsJsonAsync。 - Wonderbird
1
我刚刚安装了https://www.nuget.org/packages/Microsoft.Net.Http,但它根本没有PostAsJsonAsync方法。你确定它有这个方法吗?看一下我刚刚在我的回答中发布的图片。 - NoWar
2
我刚刚仔细检查了我们解决方案中一个针对 .Net 4.0 的项目,它调用了 client.PostAsJsonAsync()。看起来这是通过扩展方法处理的。我怀疑你可能需要在进行调用的模块中使用 System.Net.Http.Formatting 这一行。(你是否正在使用 VS 2010 - 其中一条注释说不支持 VS2010。) - Wonderbird
1
感谢您的评论!您能帮我解决如何在这种情况下使用System.Net.Http.Formatting吗?我不确定... - NoWar
2
在通过NuGet将“Microsoft HTTP Client Libraries”添加到您的项目后,只需确保“using System.Net.Http;”和“using System.Net.Http.Formatting;”位于具有client.PostAsJsonAsync()调用的源模块的顶部即可。(如果您仍然看不到,请给我发电子邮件) - Wonderbird
显示剩余2条评论

4

如果有人寻找相同的.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中使用ASYNC/AWAIT,您需要安装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))
(该代码段为C#代码,意为发送一个POST请求到“api/Account/Login”接口,并使用loginBindingModel创建HTTP内容。)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接