Ошибка загрузки / выгрузки по FTP 504 - PullRequest
0 голосов
/ 28 октября 2011

Я пытаюсь написать программу, которая будет загружать несколько файлов с FTP-сервера, архивировать их, а затем снова загружать в то же место FTP.

У меня есть попытка загрузить файл. Если это не удалось, он попытается снова.

Если ошибок НЕТ, все файлы загружают и загружают файл.

Если при загрузке возникнут какие-либо ошибки, они будут загружены при повторной попытке, но затем не смогут загрузить.

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

Вот мой код; Я добавил, где это терпит неудачу:

Загрузить:

FileInfo fileInf = new FileInfo("directory" + zip + ".zip");
string uri = "ftp://address" + fileInf.Name;
FtpWebRequest reqFTP2;
reqFTP2 = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://address" + fileInf.Name));
reqFTP2.Credentials = new NetworkCredential("username", "password");
reqFTP2.KeepAlive = true;
reqFTP2.Method = WebRequestMethods.Ftp.UploadFile;
reqFTP2.UseBinary = true;
reqFTP2.ContentLength = fileInf.Length;
int buffLength = 2048;
byte[] buff = new byte[buffLength];
int contentLen;
FileStream fs = fileInf.OpenRead();
try
{
    Stream strm = reqFTP2.GetRequestStream(); //FAILS HERE
    contentLen = fs.Read(buff, 0, buffLength);
    while (contentLen != 0)
    {
        strm.Write(buff, 0, contentLen);
        contentLen = fs.Read(buff, 0, buffLength);
    }
    strm.Close();
    fs.Close();

}
catch (Exception ex)
{

}

Скачать:

int errorOccured = 0;
while (errorOccured < 1)
{
    FileStream outputStream = new FileStream("directory\\" + file, FileMode.Create);
    FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://address/" + file));
    reqFTP.Credentials = new NetworkCredential("username", "password");
    try
    {
        reqFTP.Method = WebRequestMethods.Ftp.DownloadFile;
        reqFTP.UseBinary = true;
        FtpWebResponse response = (FtpWebResponse)reqFTP.GetResponse();
        Stream ftpStream = response.GetResponseStream();
        long cl = response.ContentLength;
        int bufferSize = 2048;
        int readCount;
        byte[] buffer = new byte[bufferSize];
        readCount = ftpStream.Read(buffer, 0, bufferSize);
        while (readCount > 0)
        {
            outputStream.Write(buffer, 0, readCount);
            readCount = ftpStream.Read(buffer, 0, bufferSize);
        }
        ftpStream.Close();
        outputStream.Close();
        response.Close();
        errorOccured++;
    }
    catch (Exception er)
    {
        outputStream.Close();
    }

Ответы [ 2 ]

1 голос
/ 29 октября 2011

Ошибка 504 - Команда не реализована для этого параметра.

подразумевает, что некоторая используемая вами опция не реализована целевым FTP-сервером.Я думаю, что ваш код приводит к причудливому запросу, советую посмотреть на болтовню FTP, которую ваш процесс создает на стороне сервера.Например, поддерживает ли сервер режим PASV?Протокол FTP в режиме ACTV (поведение по умолчанию) всегда является проблемой, поскольку он явно заставляет клиента открыть «порт приема файлов» на порту 20 и прослушать.Хотя большинство серверов поддерживают передачу в режиме PASV, это может стать проблемой, если вы явно не переведете их в режим PASV.Итак, посмотрите на болтовню, посмотрите, находится ли сервер в режиме PASV, и, если у вас все еще есть проблемы, посмотрите болтовню, чтобы увидеть, есть ли дополнительные пробелы, передаваемые во время согласования FTP.FTP довольно мутный и может быть несколько подводных камней.:-)

0 голосов
/ 29 октября 2011

Для начала, оберните ваши потоки в блоки using, чтобы они располагались соответствующим образом.

Подробнее см. MSDN .

...