Проблема с удалением файла через FTP - PullRequest
2 голосов
/ 26 января 2010

Я использую C # для загрузки файла на FTP-сервер. Если файл уже существует, истекло время ожидания FtpWebRequest, поэтому я решил сначала удалить его.

Однако WebRequestMethods.Ftp.DeleteFile также всегда истекает. Я что-то не так делаю?

Вот мой код:

FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(address);

request.Credentials = new NetworkCredential(Username, Password);
request.KeepAlive = false;
request.Method = WebRequestMethods.Ftp.DeleteFile;

try
{
    FtpWebResponse resp = (FtpWebResponse)request.GetResponse();
}
catch (Exception e)
{
    ...         
}

РЕДАКТИРОВАТЬ: О, и это не имеет значения, ведьма файл, который я пытаюсь удалить. Пока файл существует, время запроса всегда истекает. Если файл не существует, выдается другое исключение.

С учетными данными все в порядке, я могу выполнять другие операции (загрузка / загрузка без проблем). Также это не проблема сервера, если я подключаюсь к нему с клиентом (FileZilla) с тем же именем пользователя / пароль, все работает как надо.

Спасибо за вашу помощь.

Ответы [ 3 ]

1 голос
/ 26 января 2010

Есть ли у вас доступ к логам FTP-сервера? Если вы посмотрите, какие команды выполняет FTPWebRequest. Возможно, он пытается отобразить каталог перед его удалением.

Другая проблема, возможно, в том, что сервер находится в пассивном режиме, я полагаю, FileZilla может автоматически обнаружить это, проверьте соединение в filezilla, чтобы увидеть.

1 голос
/ 24 февраля 2010

Знание того, какие команды отправляются между клиентом и FTP-сервером, может помочь выяснить причину тайм-аута. Можно ли использовать анализатор пакетов, такой как Ethereal , для записи журнала связи?

Альтернативным подходом может быть использование стороннего FTP-компонента и включение входа в него. Следующий код использует наш Rebex FTP :

// create client 
Ftp client = new Ftp();
// enable logging 
client.LogWriter = new Rebex.FileLogWriter(@"c:\temp\log.txt", Rebex.LogLevel.Debug); 

// connect
client.Connect("ftp.example.org");
client.Login("username", "password");

// browse directories, transfer files 
client.DeleteFile("file.txt");

// disconnect 
client.Disconnect();
1 голос
/ 26 января 2010

Я обнаружил, что при использовании этого Ftp через FtpWebRequest он намного медленнее (поскольку использует протокол HTTP через порт 80), и это сводит меня с ума, потому что FileZilla может делать это намного быстрее (очевидно, используя Протокол FTP через порт 20/21). Здесь есть ftp-компонент с открытым исходным кодом здесь , я не знаю, будет ли он работать для вас, но стоит попробовать.

Я знаю, что это субъективный ответ, который получит отрицательную оценку, но лично использование ftp через порт 80 должно быть намного медленнее, особенно при работе с файлами, например, о том, что вы пытаетесь достичь.

...