загрузка большого файла с использованием загрузки ftpwebrequest не будет завершена

Мое программное обеспечение, которое я разработал, загружает файлы с помощью ftp на мой сервер. Я использую ftpwebrequest для загрузки всех файлов. При загрузке файла размером 700 МБ он загружает около 500 МБ, а затем останавливается, он отлично работает при загрузке файлов меньшего размера, файлы меньшего размера загружаются успешно, но он просто хочет правильно работать с большими файлами. У меня есть загрузка, выполненная в фоновом режиме, который сообщает о ходе загрузки на индикатор выполнения на основном клиенте. Когда фоновый рабочий процесс завершается, он выполняет функцию завершенного фонового рабочего процесса. Функция завершения фонового рабочего процесса выполняется, но загрузка никогда не завершается, а индикатор выполнения зависает примерно на 65 процентах, как будто клиент просто прекращает загрузку и выполняет функцию завершения фонового рабочего процесса, как если бы он завершил загрузку. Что здесь может пойти не так, загрузка не завершается, и файл не появляется на сервере, вот код, который дозирует загрузку.

void UploadFileInBackground_DoWork(object sender,DoWorkEventArgs e)
{
        byte[] data;
        int packetsize = 1024 * 8;

        string Destination = UploadURI + cattext + "/" + ID + ".obj";
        string source = DialogBrower.FileName;
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(Destination);
        request.Credentials = new NetworkCredential("user", "pass");
        request.Method = WebRequestMethods.Ftp.UploadFile;
        request.UsePassive = true;
        request.UseBinary = true;
        request.KeepAlive = false;
        using (FileStream fs = new FileStream(source, FileMode.Open, FileAccess.Read))
        {
            try
            {
                long filesize = fs.Length;
                long sum = 0;
                int count = 0;
                data = new byte[packetsize];
                Stream reqStream = request.GetRequestStream();
                float totalpackits = filesize / packetsize;
                float weightofpackit = 100 / totalpackits;
                float percentage = 0;
                while (sum < filesize)
                {
                    List<string> statusparms = new List<string>();
                    count = fs.Read(data, 0, packetsize);
                    reqStream.Write(data, 0, count);
                    sum += count;
                    percentage += weightofpackit;
                    int percentagetotal = Convert.ToInt32(Math.Round(percentage));
                    statusparms.Add(sum.ToString());
                    statusparms.Add(filesize.ToString());
                    UploadFileInBackground.ReportProgress(percentagetotal, statusparms);
                }
                reqStream.Close();
                uploadedname = uploadingname;
            }
            finally
            {
                fs.Dispose();
                data = null;
            }
        }
}

person FileStreamers    schedule 11.12.2012    source источник
comment
Я отредактировал ваш заголовок. См. Должны ли вопросы включать «теги» в свои заголовки?, если нет единого мнения, не следует.   -  person John Saunders    schedule 11.12.2012


Ответы (2)


Пожалуйста, попробуйте это вместо этого:

request.UseBinary = false;
person Truong Anh Tuan    schedule 05.03.2013

давайте попробуем это

request.KeepAlive = false;

to

request.KeepAlive = true;
person Kelvin Wong    schedule 20.03.2013