Исключение при загрузке большого файла по FTP

Я делаю FTP-клиент и пытаюсь загрузить файл на сервер (~ 300 МБ), но получаю следующую ошибку, когда было передано почти 100 МБ файла:

The underlying connection was closed: An unexpected error occurred on a receive.

Вот мой код:

private void UploadFile(string filepath, string filename)
    {
        try
        {
            FtpWebRequest ftp = (FtpWebRequest)FtpWebRequest.Create("ftp://" + server + "/" + filename);

            //ftp.KeepAlive = false;
            //ftp.Timeout = 1000000;
            //ftp.UsePassive = true;
            //ftp.ReadWriteTimeout = 100000;

            Path.GetFileName(filepath);
            ftp.Credentials = new NetworkCredential(username, password);
            ftp.Method = WebRequestMethods.Ftp.UploadFile;


            FileStream stream = File.OpenRead(filepath);
            byte[] buffer = new byte[stream.Length];
            stream.Read(buffer, 0, buffer.Length);
            stream.Close();


            Stream requestStream = ftp.GetRequestStream();
            //requestStream.ReadTimeout = 1000000;
            //requestStream.WriteTimeout = 1000000;
            requestStream.Write(buffer, 0, buffer.Length);
            requestStream.Close();         

            FtpWebResponse response = (FtpWebResponse)ftp.GetResponse();
            response.Close();
        }
        catch (Exception ex) { CreateRunLogFile(ex.Message); }

        CreateRunLogFile("Uploading of file " + filepath + " ended.");
    }

Я пытаюсь использовать,

ftp.KeepAlive = false;
ftp.Timeout = 1000000;
ftp.UsePassive = true;

Но это не помогло.


person vasa911    schedule 08.09.2012    source источник
comment
Файл все еще передается? Это может быть тайм-аут канала управления, где на самом деле все в порядке. Кроме того, пытались ли вы загрузить идентичный файл с помощью ftp-клиента, такого как FileZilla? Какое поведение вы видите?   -  person JamieMeyer    schedule 09.09.2012
comment
@JamieMeyer, Нет, когда программа бросает исключение, передача файла заканчивается. Насчет канала управления я не понимаю. Я пытался загрузить с помощью FileZilla и WinSCP, файл загружен успешно. И еще один, я заметил, что исключение выбрасывается после 100 секунд загрузки.   -  person vasa911    schedule 09.09.2012
comment
Значение тайм-аута, которое вы установили, находится в миллисекундах, что, вероятно, объясняет, что происходит. Кроме того, похоже, что это также значение по умолчанию, в отличие от задокументированного значения по умолчанию. Попробуйте установить для него значение -1 и повторите попытку. Это может помочь: sidesofmarch.com/index.php/archive/2012/04/06/   -  person JamieMeyer    schedule 09.09.2012
comment
@JamieMeyer, я изменил код на этот: FtpWebRequest ftp = (FtpWebRequest)WebRequest.Create("ftp://" + server + "/" + filename); ftp.UsePassive = true; Path.GetFileName(filepath); ftp.Credentials = new NetworkCredential(username, password); ftp.Method = WebRequestMethods.Ftp.UploadFile; ftp.Timeout = -1;, но это не помогло.   -  person vasa911    schedule 09.09.2012


Ответы (1)


Проверьте настройки целевого брандмауэра. Если это сервер LINUX, на котором работает vsFTPd, то служба ftp сервера имеет настройки FILESIZE и TIMEOUT в файле конфигурации.

Обязательно перезапустите службу vsFTPd после настройки параметров FILESIZE и TIMEOUT.

person user4459450    schedule 15.01.2015