我正在使用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)连接到它,则一切正常。
感谢您的帮助。
答案 0 :(得分:1)
我通过FtpWebRequest使用此Ftp找到的东西,它本身就慢得多(因为它在端口80上使用HTTP协议),它让我疯狂,因为FileZilla可以更快地完成它(显然使用端口20/21上的FTP协议)。有一个开源的ftp组件here,我不知道它是否适合你,但值得一试。
我知道这是一个主观的答案,会被低估,但就个人而言,使用ftp over 80,速度肯定会慢得多,尤其是在文件操作方面,就像你想要实现的那样。
答案 1 :(得分:1)
您是否可以访问FTP服务器的日志?如果您确实查看了FTPWebRequest正在执行的命令。它可能是在删除目录之前尝试列出目录。
另一个问题可能是服务器处于被动模式,我相信FileZilla可能会自动检测到这一点,请检查filezilla中的连接。
答案 2 :(得分:1)
了解客户端和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();