WP8中使用async/await扩展HttpWebRequest

Posted by baicai on April 3, 2014

前文讲到WP8中使用Async执行HTTP请求,用了微软提供的扩展。下面提供了一种方法,自己实现HttpWebRequest的扩展。

namespace HttpExtensions
{
    public static class WebRequestExtensions
    {
        public async static Task<WebResponse> GetResponseAsync(this HttpWebRequest request)
        {
            return await Task<WebResponse>.Factory.FromAsync(request.BeginGetResponse, request.EndGetResponse, request);
        }

        public async static Task<Stream> GetRequestStreamAsync(this HttpWebRequest request)
        {
            return await Task<Stream>.Factory.FromAsync(request.BeginGetRequestStream, request.EndGetRequestStream, request);
        }
    }
}

随后就可以使用 await HttpWebRequest.GetResponseAsync() 轻松使用http请求了。</span> </p>

附带一个WebClient的扩展

namespace HttpExtensions
{
    public static class WebClientExtensions
    {
        public async static Task<Stream> GetStreamAsync(this WebClient webClient, Uri uri)
        {
            var tcs = new TaskCompletionSource<Stream>();

            webClient.OpenReadCompleted += (s, e) =>
            {
                if (e.Error != null)
                {
                    tcs.SetException(e.Error);
                }
                else
                {
                    tcs.SetResult(e.Result);
                }
            };
            webClient.OpenReadAsync(uri);

            return await tcs.Task;
        }

        public async static Task<string> GetStringAsync(this WebClient webClient, Uri uri)
        {
            var tcs = new TaskCompletionSource<string>();

            webClient.DownloadStringCompleted += (s, e) =>
            {
                if (e.Error != null)
                {
                    tcs.SetException(e.Error);
                }
                else
                {
                    tcs.SetResult(e.Result);
                }
            };
            webClient.DownloadStringAsync(uri);

            return await tcs.Task;
        }
    }
}