C# ftp-загрузка застряла в определенном файле

У меня проблема с моей программой на C#. У меня есть большой zip-архив (около 4 Гб), который разбит на мелкие части, на самом деле каждая часть составляет 100 Мб. Итак, когда моя программа начинает загружать файлы, она отлично работает до тех пор, пока не начнется загрузка 14-го фрагмента. моя программа загрузила только ~ 90 Мб этого куска, а затем я получаю сообщение об ошибке «Удаленный сервер возвратил ошибку: (451) Локальная ошибка при обработке». Моя программа на C# определяет, не был ли файл загружен успешно, и пытается его загрузить, поэтому у меня бесконечный цикл.

private static void SendToFtp(AppConfig cfg, string zipName)
{
    Console.WriteLine("Starting FTP upload");
    NetworkCredential creds = new NetworkCredential(cfg.FtpUserName, cfg.FtpPassword);
   try
   {
    StringBuilder sb = new StringBuilder();
    DirectoryInfo di = new DirectoryInfo(cfg.ZipFolder);
    byte[] buffer = null;
    foreach (var file in di.EnumerateFiles())
    {
        using (Stream st = File.OpenRead(file.FullName))
        using (BinaryReader br = new BinaryReader(st))
        {

            bool success = false;
            while (!success)
            {
                br.BaseStream.Seek(0, SeekOrigin.Begin);
                buffer = br.ReadBytes((int)file.Length);

                sb.Append($"ftp://{cfg.FtpHost}/{file.Name}");
                request = (FtpWebRequest)WebRequest.Create(sb.ToString());
                request.Method = WebRequestMethods.Ftp.UploadFile;
                request.UseBinary = false;
                request.UsePassive = false;
                request.KeepAlive = false;
                request.ServicePoint.ConnectionLimit = 1000;
                request.Credentials = new NetworkCredential(cfg.FtpUserName, cfg.FtpPassword);

                using (Stream requestStream = request.GetRequestStream())
                {
                    try
                    {
                        requestStream.Write(buffer, 0, buffer.Length);
                        requestStream.Flush();
                        requestStream.Close();

                        var resp = (FtpWebResponse)request.GetResponse();
                        success = !success;
                        Console.WriteLine($"======================{file.Name}=======================");
                        Console.WriteLine($"Message:{resp.StatusDescription}");
                        Console.WriteLine($" Status code: {resp.StatusCode}");
                        Console.WriteLine($"========================================================");
                    }
                    catch (Exception ex)
                    {
                        request.Abort();
                        Console.WriteLine($"MSG: {ex.Message}");

                    }
                }
                sb.Clear();
            }
        }

    }
    Console.WriteLine("FTP upload finished");
    }
    catch (Exception ex)
    {
         Console.WriteLine($"{ex.Message}; {ex.Source}");
    }

}

Итак, может ли кто-нибудь помочь мне или указать мне, где я ошибаюсь. Спасибо!

Код ответа 451 может быть отправлен в ответ на любую команду, инициирующую передачу файла. Это временный отрицательный ответ, что означает, что состояние ошибки является временным. Обычно он отправляется в ответ на обнаружение сервером непредвиденной локальной ошибки при обработке данных, которые он передает или получает.

TheGeneral 26.10.2018 09:06

У меня эта ошибка возникает только на одном компьютере под управлением Windows Server 2012 R2, с моего ПК, на котором разрабатывается эта программа, проблем нет.

SBarkovskis 26.10.2018 09:13

при такой ошибке вы можете просто отключиться, снова подключиться и продолжить отправку. Иногда есть пределы времени.

BugFinder 26.10.2018 09:41
1
3
172
0

Другие вопросы по теме