using System; using System.Collections.Generic; using System.IO; using System.Net; using System.Text; using System.Threading.Tasks; public class AsyncHttpWebRequest { private HttpWebRequest webRequest; public async Task DoRequest(Uri uri, string method, string contentType, Dictionary postParameters) { this.webRequest = (HttpWebRequest)HttpWebRequest.CreateHttp(uri); this.webRequest.Method = method; this.webRequest.ContentType = contentType; if (method == "POST") { await this.SendPostData(postParameters); } return await this.GetWebContent(); } private async Task SendPostData(Dictionary parameters) { await Task.Factory.FromAsync(this.webRequest.BeginGetRequestStream, this.webRequest.EndGetRequestStream, this.webRequest) .ContinueWith(streamResult => { using (Stream postStream = streamResult.Result) { string postData = string.Empty; int count = 0; foreach (KeyValuePair kvp in parameters) { postData += kvp.Key + "=" + kvp.Value; if (++count < parameters.Count) { postData += "&"; } } byte[] byteArray = Encoding.UTF8.GetBytes(postData); postStream.Write(byteArray, 0, byteArray.Length); } }); } private async Task GetWebContent() { return await Task.Factory.FromAsync(this.webRequest.BeginGetResponse, this.webRequest.EndGetResponse, this.webRequest) .ContinueWith(webResponseResult => { string responseString = string.Empty; try { using (HttpWebResponse response = (HttpWebResponse)webResponseResult.Result) { using (StreamReader streamRead = new StreamReader(response.GetResponseStream())) { responseString = streamRead.ReadToEnd(); } } } catch (Exception e) { responseString = null; } return responseString; }); } }