我有这个代码在.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中做同样的事情。
但我面临两个问题,我不知道如何解决它们。
client.PostAsJsonAsync
不存在。client.PostAsync
,需要HttpContext
。
我在WPF客户端内请求...伙计们,我不知道如何归档相同的功能......
请帮忙!
答案 0 :(得分:7)
建议使用BCL / async /“Microsoft HTTP Client Libraries”帮助程序项目来“补充”.Net 4.0,具有与.Net 4.5相同的功能(可以在NuGet包管理器中找到最新版本。) 有关详细信息,请参阅以下链接:http://www.nuget.org/packages/microsoft.bcl.async (注意:您可以通过相同的基本机制获得对http客户端的支持)
答案 1 :(得分: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 / AWAIT for .NET 4.0,你必须安装Microsoft.BCL dll并使用异步版本的HttpClient 。
答案 2 :(得分:2)
即使安装了以下软件包,我也会遇到其他错误。
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 here)
public HttpContent CreateHttpContent(object data)
{
return new StringContent(JsonConvert.SerializeObject(data), Encoding.UTF8, "application/json");
}
PostAsync("api/Account/Login",CreateHttpContent(loginBindingModel))