public static WebResponseData IssueRequest(
            Uri uri,
            string method = "GET",
            string requestContent = null,
            IEnumerable<Cookie> cookies = null,
            TimeSpan? timeout = null,
            bool downloadAsBinary = false)
        {
            cookies = cookies ?? Enumerable.Empty<Cookie>();
            timeout = timeout ?? DefaultTimeout;

            var responseData = new WebResponseData { RequestedUri = uri };

            try
            {
                var webRequest = GetRequest(uri, method, timeout.Value, requestContent);

                AttachOutgoingCookies(webRequest, cookies);

                using (var webResponse = (HttpWebResponse)webRequest.GetResponse())
                using (var responseStream = webResponse.GetResponseStream())
                {
                    responseData.StatusCode = webResponse.StatusCode;
                    responseData.ContentType = webResponse.GetResponseHeader("Content-Type");

                    if (downloadAsBinary)
                    {
                        ProcessResponseBinary(responseStream, responseData);
                    }
                    else
                    {
                        ProcessResponse(responseStream, responseData);
                    }
                }
            }
            catch (WebException e)
            {
                if (e.Status == WebExceptionStatus.ProtocolError)
                {
                    var webResponse = (HttpWebResponse)e.Response;
                    responseData.StatusCode = webResponse.StatusCode;
                }
            }

            return responseData;
        }
        private static void ProcessResponseBinary(
            Stream responseStream,
            WebResponseData responseData)
        {
            var buffer = new byte[BinaryBufferLength];

            using (var memoryStream = new MemoryStream())
            {
                while (true)
                {
                    int read = responseStream.Read(buffer, 0, buffer.Length);
                    if (read <= 0)
                    {
                        responseData.Bytes = memoryStream.ToArray();
                        return;
                    }

                    memoryStream.Write(buffer, 0, read);
                }
            }
        }
 private static void ProcessResponse(
     Stream responseStream,
     WebResponseData responseData)
 {
     using (var reader = new StreamReader(responseStream, Encoding.UTF8))
     {
         responseData.Content = reader.ReadToEnd();
     }
 }