не могу скачать с HttpWebRequest более одного раза - PullRequest
0 голосов
/ 12 февраля 2020

Я новичок в C# и пытаюсь написать менеджер загрузок с помощью HttpWebRequest. мой менеджер вызывает новый класс для разбиения файла на куски для каждого файла, и этот класс вызывает новый класс загрузчика.

мой код для загрузки:

   private void StartDownload()
   {      
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
        Console.WriteLine("request");
        request.AddRange((int)_startPos, (int)_endPos);
        WebResponse res = request.GetResponse();         
        Console.WriteLine("res: "+res);
        RequestContentLength = 0;
        try
        {
             bool isFinished = false;
             isDownloading = true;
             double speed = 0;
             using (var responseStream = res.GetResponseStream())
             {
                using (FileStream localFileStream = new FileStream(FilePath, FileMode.Append))
                {
                    Console.WriteLine("download started - "+ Url);
                    var buffer = new byte[4096];
                    int bytesRead;
                    DateTime lastDate = DateTime.Now;
                    int lastDownloaded = 0;
                    while ((bytesRead = responseStream.Read(buffer, 0, buffer.Length)) > 0 && isDownloading)
                    {
                       totalBytesRead += bytesRead;
                       if ((DateTime.Now - lastDate).TotalSeconds >= 1)
                       {
                           lastDate = DateTime.Now;
                           speed = totalBytesRead - lastDownloaded;
                           lastDownloaded = totalBytesRead;
                        }
                        RequestContentLength += bytesRead;
                        localFileStream.Write(buffer, 0, bytesRead);                           
                        double percentage = totalBytesRead * 100 / FileHeader.FileSize;
                        onDownloadProgress?.Invoke(ID, fname, percentage, totalBytesRead, FileHeader.FileSize, speed);
                  }
                  isFinished = true;                       
               }
           }
           if (isFinished) {
                    onDownloadFinished?.Invoke(ID, fname, true, "success");
                }
                else
                {
                    onDownloadFinished?.Invoke(ID, fname, false, "error");
                }
                isDownloading = false;
            }
            catch (Exception ex)
            {
                isDownloading = false;              
                onDownloadFinished?.Invoke(ID, fname, false, ex.Message);
            }

        }

код отлично работает для ПЕРВАЯ загрузка (я обрезал остальное, чтобы сделать его короче), но когда я вызываю его после первой загрузки, я получаю Console.WriteLine("request"); для вывода, но остальное останавливается, и через минуту или две я получаю ошибку тайм-аута на WebResponse res = request.GetResponse(); Я не мог назвать мою точную проблему и не смог найти решение. Есть несколько похожих сообщений по этому поводу, и я попробовал большинство из них, но у меня не работает.

...