如何让普通的WebRequest异步和awaitable? [英] How to make ordinary WebRequest async and awaitable?
问题描述
我需要做以下code异步和awaitable。
I need to make the following code async and awaitable.
我需要从Web服务器获取大量的数据,然后将此数据将被用来填充XAML页面中我的申请。
I need to get a lot of data from the web server, and then this data will be used to populate the xaml page in my application.
所以,我需要的DefLogin()方法是awaitable。
So, I need the DefLogin() method to be awaitable.
这可能吗?
public void DefLogin()
{
postData = "My Data To Post";
var url = new Uri("Url To Post to", UriKind.Absolute);
webRequest = WebRequest.Create(url);
webRequest.Method = "POST";
webRequest.ContentType = "text/xml";
webRequest.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), webRequest);
}
public void GetRequestStreamCallback(IAsyncResult asynchronousResult)
{
webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
Stream postStream = webRequest.EndGetRequestStream(asynchronousResult);
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
postStream.Write(byteArray, 0, byteArray.Length);
postStream.Close();
Debug.WriteLine("Start BEGINGetResponse");
webRequest.BeginGetResponse(new AsyncCallback(GetResponseCallback), webRequest);
}
public void GetResponseCallback(IAsyncResult asynchronousResult)
{
try
{
HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
HttpWebResponse response;
response = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult);
Stream streamResponse = response.GetResponseStream();
StreamReader streamReader = new StreamReader(streamResponse);
string Response = streamReader.ReadToEnd();
streamResponse.Close();
streamReader.Close();
response.Close();
if (Response == "")
{
//show some error msg to the user
Debug.WriteLine("ERROR");
}
else
{
//Your response will be available in "Response"
Debug.WriteLine(Response);
}
}
catch (WebException)
{
//error
}
}
我看到计算器这个问题:<一href=\"http://stackoverflow.com/questions/14577346/converting-ordinary-http-post-web-request-with-async-and-await\">Converting与异步和等待普通HTTP POST的网络请求,但我不能正确理解问题的答案。
I saw this question on StackOverflow: Converting ordinary Http Post web request with Async and Await, but I could not understand the answer properly.
请谁能帮助?我会很感激!
Please can anyone help? I would be really grateful!
推荐答案
您可以使用 TaskFactory.FromAsync
来的转换APM为TAP ,使得很多微小的扩展方法是这样的:
You can use TaskFactory.FromAsync
to convert APM to TAP, making a lot of tiny extension methods like this:
public static Task<Stream> GetRequestStreamAsync(this WebRequest request)
{
return TaskFactory.FromAsync(request.BeginGetRequestStream, request.EndGetRequestStream, null);
}
和 WebRequest.GetResponse
做同样的和(如有必要) Stream.Write
, Stream.Flush
等
and do the same for WebRequest.GetResponse
and (if necessary) Stream.Write
, Stream.Flush
, etc.
然后你可以使用编写实际的逻辑异步
和等待
无任何回调:
Then you can write your actual logic using async
and await
without any callbacks:
public async Task DefLoginAsync()
{
postData = "My Data To Post";
var url = new Uri("Url To Post to", UriKind.Absolute);
webRequest = WebRequest.Create(url);
webRequest.Method = "POST";
webRequest.ContentType = "text/xml";
using (Stream postStream = await webRequest.GetRequestStreamAsync())
{
byte[] byteArray = Encoding.UTF8.GetBytes(postData);
await postStream.WriteAsync(byteArray, 0, byteArray.Length);
await postStream.FlushAsync();
}
try
{
string Response;
using (var response = (HttpWebResponse)await webRequest.GetResponseAsync());
using (Stream streamResponse = response.GetResponseStream())
using (StreamReader streamReader = new StreamReader(streamResponse))
{
Response = await streamReader.ReadToEndAsync();
}
if (Response == "")
{
//show some error msg to the user
Debug.WriteLine("ERROR");
}
else
{
//Your response will be available in "Response"
Debug.WriteLine(Response);
}
}
catch (WebException)
{
//error
}
}
这篇关于如何让普通的WebRequest异步和awaitable?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!