private Task<string> UploadStringAsync(string method, IProgress<string> progress)
        {
            return Task.Run(() =>
                {
                    using (var client = new WebClient())
                    {
                        var address = restClient.PrepareUri();

                        restClient.SetHeaders(client);
                        
                        client.TraceRequest(address, method, data, progress);

                        var watch = new Stopwatch();
                        watch.Start();
                        client.UploadString(address, method, data);
                        watch.Stop();
                        
                        client.TraceResponse(address,
                                             method,
                                             string.Format(CultureInfo.InvariantCulture,
                                                           "Completed in {0} seconds",
                                                           watch.Elapsed.TotalSeconds),
                                             progress);
                    }

                    return "Done";
                });
        }
        private async Task<string> DownloadStringAsync(IProgress<string> progress)
        {
            using (var client = new WebClient())
            {
                var address = PrepareUri();
                SetHeaders(client);


                client.TraceRequest(address, "GET", progress);

                var responseString = await client.DownloadStringTaskAsync(address)
                                                 .ConfigureAwait(false);

                client.TraceResponse(address, "GET", responseString, progress);

                return responseString;
            }
        }
        private async Task<Stream> DownloadStreamAsync(IProgress<string> progress)
        {
            var downloadTask = Task.Run(() =>
                {
                    using (var client = new WebClient())
                    {
                        var address = PrepareUri();

                        SetHeaders(client);

                        client.TraceRequest(address, "GET", progress);

                        var bytes = client.DownloadData(address);

                        client.TraceResponse(address, "GET", "Length=" + bytes.Length, progress);

                        return new MemoryStream(bytes);
                    }
                }).ConfigureAwait(false);

            return await downloadTask;
        }