Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > .NET для новичков > Проблема с загрузкой по ftp


Автор: Track 14.3.2013, 03:06
Сейчас утилитой пользуются около десятка пользователей, но только у одного проблема при загрузке файла размером около 70ти мегабайт.
Файлы меньшего размера у него загружаются.
Любопытно то, что файл полностью загружается на сервер (проверил именно загружаемый им архив - архив нормальный, небитый), затем несколько минут у пользователя показывается состояние загрузки 100%, а потом выскакивает сообщение об ошибке - "Базовое соединение закрыто: непредвиденная ошибка при приеме".

Код

    private void UploadWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            long Offset = (long)e.Argument;
            string ftpMethod;

            if (Offset > 0)
                ftpMethod = WebRequestMethods.Ftp.AppendFile;
            else
                ftpMethod = WebRequestMethods.Ftp.UploadFile;

            System.Uri uploadUri = new System.Uri(WebData.GetUploadAddress(this.FtpFolder, this.User.ID, this.SceneZipFileName));

            var ftpWebRequest = (FtpWebRequest)WebRequest.Create(uploadUri);
            ftpWebRequest.Method = ftpMethod;
            ftpWebRequest.KeepAlive = false;

            ftpWebRequest.Credentials = WebData.GetFtpCredential();

            using (var inputStream = File.OpenRead(this.SceneZipFileName))
            {
                long in_stream_lenght = inputStream.Length;
                if (Offset > 0)
                    inputStream.Seek(Offset, SeekOrigin.Begin);

                try
                {
                    using (var outputStream = ftpWebRequest.GetRequestStream())
                    {
                        var buffer = new byte[1024 * 1024];
                        int readBytesCount;
                        while ((readBytesCount = inputStream.Read(buffer, 0, buffer.Length)) > 0 && !e.Cancel && !UploadWorker.CancellationPending && !CancelUploadDownload)
                        {
                            outputStream.Write(buffer, 0, readBytesCount);
                            var progress = inputStream.Position * 100.0 / in_stream_lenght;
                            UploadWorker.ReportProgress((int)progress);
                        }
                    }
                }
                catch (Exception ex)
                {
                    e.Cancel = true;
                    MessageBox.Show(ex.GetBaseException().Message, "Error!!!");
                }
            }
        }

Автор: Track 22.3.2013, 23:19
В итоге все решилось установкой свойства

UsePassive = true;

Автор: Machaon 23.3.2013, 16:31
Все зависит от типа подключение к сети пользователя.
К примеру режим Active при подключение через роутер(маршрутизатор) требует дополнительной настройки (прокидывание портов).

Поэтому мой совет реализуй проверку типа подключения и напиши класс для работы с ними.

Автор: Track 27.3.2013, 01:22
Спасибо, но совсем непонятно.

Автор: baldina 27.3.2013, 02:22
Да, непонятно. Не по теме. Если клиент может работать только в пассивном режиме, вообще передачи не было бы.
Похоже, что в активном режиме сервер не закрывает соединение после передачи.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)