Ftp GetFileSize随机抛出FTP错误503(错误的命令序列)

时间:2009-01-15 12:37:06

标签: .net ftp size

要获取文件列表中每个文件的文件大小,我使用以下代码:

foreach (String f in files)
{
  UriBuilder ftpUri = new UriBuilder("ftp", ftpServer, -1, ftpPfadZuLogDateien + "/" + f);
  FtpWebRequest ftpclientRequest1 = (FtpWebRequest)WebRequest.Create(ftpUri.Uri);
  ftpclientRequest1.Method = WebRequestMethods.Ftp.GetFileSize;
  ftpclientRequest1.Credentials = new NetworkCredential(ftpLoginName, ftpPassword);
  FtpWebResponse response1 = (FtpWebResponse)ftpclientRequest1.GetResponse();
  long filesize = response1.ContentLength;
  response1.Close();
  // store the file size somewhere
}

如果列表中只有几个文件,这通常有效。但是在连续一些请求(有时是10个,有时是100个)之后,GetResponse()将抛出错误503(错误的命令序列)。

试图告诉我这是什么错误?我查询得太快了吗?忘记清理任何资源?
我该怎么办呢?

其他信息:
在连接上设置KeepAlive = false会使第二个请求失败并显示错误550(找不到文件/拒绝访问?)。
设置UsePassive = false并没有改变任何东西 设置UseBinary = true并没有改变任何东西 在键盘上敲我的头并没有改变任何东西。

[更新] beckr.org提供了一个答案 - 因为它隐藏在链接和大量文本背后,这里是简短的版本:我改变了源代码,所以我重用了NetworkCredentials:

NetworkCredential myCredentials = new NetworkCredential(ftpLoginName, ftpPassword);
foreach (String f in files)
{
  UriBuilder ftpUri = new UriBuilder("ftp", ftpServer, -1, ftpPfadZuLogDateien + "/" + f);
  FtpWebRequest ftpclientRequest1 = (FtpWebRequest)WebRequest.Create(ftpUri.Uri);
  ftpclientRequest1.Method = WebRequestMethods.Ftp.GetFileSize;
  ftpclientRequest1.Credentials = myCredentials;
  FtpWebResponse response1 = (FtpWebResponse)ftpclientRequest1.GetResponse();
  long filesize = response1.ContentLength;
  response1.Close();
  // store the file size somewhere
}

这样一切都会像它应该的那样。

1 个答案:

答案 0 :(得分:4)

使用Wireshark进行跟踪 - 状态代码为503,但消息更可能是不同的。 在我的情况下,FtpWebRequest使用USER xyz重新验证每3个请求左右,这导致服务器(ProFTPD)回复“503您已经登录”,这导致FtpWebRequest挽救。请参阅Microsoft的反馈,了解为何http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/9f0510f9-fa39-4aa4-8bd5-afb926282144/发生这种情况。 如果微软会(正确地)开源,我就不会遇到这个bug的问题,因为我可以自己修复它,提供一个补丁,它很可能会进一步发布。但这不是微软的工作方式。 现在调查http://sourceforge.net/projects/dotnetftpclient/