c#异步http请求
我想对某些服务器进行异步调用,以便主线程不会停止请求。c#异步http请求
我创造了我的要求是这样的:
//Create Request
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(uri);
request.Method = method;
request.ContentType = "application/XML";
System.Text.UTF8Encoding encoding = new System.Text.UTF8Encoding();
byte[] bytes = encoding.GetBytes(data);
request.ContentLength = bytes.Length;
try
{
using (Stream requestStream = request.GetRequestStream())
{
// Send the data.
requestStream.Write(bytes, 0, bytes.Length);
}
request.BeginGetResponse((x) =>
{
using (HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(x))
{
if (callback != null)
{
callback(response.GetResponseStream());
}
}
}, null);
}
catch (Exception ex)
{
//TODO: Log error
}
但仍然是线程停止对该请求一段时间。特别是用
(Stream requestStream = request.GetRequestStream())
行有没有什么办法,使我们可以把它完全异步或一些其他更好的办法,使我们的主线程不会挂起该请求。
需要使用异步方法并等待它们。
using (var stream = await request.GetRequestStreamAsync())
{
await stream.WriteAsync(bytes, 0, bytes.Length);
}
这是一个简单的示例,我正在使用它来发出异步请求。马克与async keyword
using (var httpClient = new HttpClient())
{
string requestContent = string.Empty; // JSON Content comes here
HttpContent httpContent = new StringContent(requestContent, Encoding.UTF8, "application/json");
HttpRequestMessage httpRequestMessage = new HttpRequestMessage(Verb, url);
httpRequestMessage.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
httpRequestMessage.Content = request.Verb == HttpMethod.Get ? null : httpContent;
response = httpClient.SendAsync(httpRequestMessage);
var responseContent = await response.Result.Content.ReadAsStringAsync();
你的方法}
using (HttpClient client = new HttpClient())
{
var content = new StringContent(data, Encoding.UTF8, "application/xml");
var response = await client.PostAsync(uri, content);
var respString = await response.Content.ReadAsStringAsync();
}
我在这里有点困惑。在请求中,我们通过等待等待实际等待响应。此外,如果方法A()发出请求,那么我们必须通过等待任务A()来调用,然后等待响应。仅使其同步。 – user2692032 2014-10-01 06:13:09
@ user2692032 [在异步方法中发生了什么](http://msdn.microsoft.com/zh-cn/library/hh191443.aspx) – EZI 2014-10-01 07:16:31
当然 - 调用[GetRequestStreamAsync(http://msdn.microsoft.com/en-us/library/system.net.webrequest.getrequeststreamasync( v = vs.110).aspx)并等待结果。 – 2014-09-30 16:17:23
如果可以的话,或者只是使用'HttpClient'和'await' - 它更加简洁。 – Luaan 2014-09-30 16:19:57
[documentation](http://msdn.microsoft.com/en-us/library/d4cek6cc.aspx)说,如果您调用'GetRequestStream',那么您必须*调用'GetResponse'来获取响应。如果你想要一个使用'BeginGetResonse'的异步响应,那么你必须*调用'BeginGetRequeststream'来获取请求流。 – 2014-09-30 19:05:32