c# - 如何让普通的 WebRequest 异步且可等待?

标签 c# windows-phone-7 httpwebrequest async-await webrequest

我需要使以下代码异步且可等待。

我需要从网络服务器获取大量数据,然后这些数据将用于填充我的应用程序中的 xaml 页面。

所以,我需要 DefLogin() 方法可以等待。

这可能吗?

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

我在 StackOverflow 上看到了这个问题:Converting ordinary Http Post web request with Async and Await , 但我无法正确理解答案。

请问有人能帮忙吗?我将不胜感激!

最佳答案

您可以使用 TaskFactory.FromAsyncconvert APM to TAP , 做了很多像这样的微小扩展方法:

public static Task<Stream> GetRequestStreamAsync(this WebRequest request)
{
  return TaskFactory.FromAsync(request.BeginGetRequestStream, request.EndGetRequestStream, null);
}

并对 WebRequest.GetResponse 和(如果需要)Stream.WriteStream.Flush 等执行相同的操作。

然后您可以使用 asyncawait 编写您的实际逻辑,而无需任何回调:

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

关于c# - 如何让普通的 WebRequest 异步且可等待?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18207730/

相关文章:

c# - 跟踪 HTTPWebRequest 的进度

c# - 将字符串数组添加到组合框

Xamarin Forms PCL - 干净、简单的网络请求方法?

c# - 参数 5 : cannot convert from 'System.Drawing.Image' to 'string' - calling class1 from Main Class

c# - Windows Phone 7 Silverlight 使用 session

windows-phone-7 - Windows Phone SDK 7.1 Beta 2 相对于 Beta 1 的新增功能

windows-phone-7 - 将 Team build 输出文件夹中的文件包含到 XAP 中

symfony - 如何在 symfony 中获取请求 header value

c# - session 状态超时

c# - 使用 C# 和 OleDbConnection 从特定工作表的 Excel 文件中获取列名称