Мне нужно скачать большие файлы JSON с URL. Используется метод post, с параметром, именем пользователя, паролем и т. Д.
Поскольку это занимает довольно много времени, я пытаюсь установить индикатор выполнения, чтобы пользователи могли видеть, как далеко он продвинулся и сколько осталось.
Задача
Я не могу получить длину содержимого файла Json из URL до загрузки. Пожалуйста, смотрите комментарий об ошибке в коде ниже. Есть предложения?
public void downloadJson(string Url, string UserName, string Password, string FileDownload)
{
HttpWebRequest httpRequest;
HttpWebResponse httpResponse;
int Size;
var json = string.Format("{{\"user\":\"{0}\",\"pwd\":\"{1}\",\"DS\":\"KG\"}}", UserName, Password);
httpRequest = (HttpWebRequest)WebRequest.Create(Url);
httpRequest.Method = WebRequestMethods.Http.Post;
httpRequest.ContentLength = json.Length;
httpRequest.ContentType = "application/json";
httpRequest.Timeout = 600 * 60 * 1000;
var data = Encoding.ASCII.GetBytes(json); // or UTF8
using (var s = httpRequest.GetRequestStream())
{
s.Write(data, 0, data.Length);
s.Close();
}
httpResponse = (HttpWebResponse)httpRequest.GetResponse();
Size = (int)httpResponse.ContentLength;
Stream rs = httpResponse.GetResponseStream();
//**********************************************
//Here is the error
//the below progress bar would never work
//Because Size returned from above is always -1
//**********************************************
progressBar.Invoke((MethodInvoker)(() => progressBar.Maximum = Size));
using (FileStream fs = File.Create(FileDownload))
{
byte[] buffer = new byte[16 * 1024];
int read;
int position;
using (rs)
{
while ((read = rs.Read(buffer, 0, buffer.Length)) > 0)
{
fs.Write(buffer, 0, read);
position = (int)fs.Position;
progressBar.Invoke((MethodInvoker)(() => progressBar.Value = position));
Console.WriteLine ("Bytes Received: " + position.ToString());
}
}
fs.Close();
}