2

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

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(Bad Sequence of Commands)。

这个错误想告诉我什么?我查询太快了吗?忘记清理任何资源?
我能做些什么呢?

附加信息:
在连接上设置 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
}

这样,一切都像它应该的那样工作。

4

1 回答 1

4

使用 Wireshark 进行跟踪 - 状态码是 503,但消息很可能是不同的。在我的例子中,FtpWebRequest 每隔 3 个左右就使用 USER xyz 重新验证一次,这导致服务器 (ProFTPD) 回复“503 You are already logged in”,这导致 FtpWebRequest 退出。请参阅 Microsoft 的反馈,了解为什么会发生这种情况,网址为http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/9f0510f9-fa39-4aa4-8bd5-afb926282144/。如果微软会(正确地)开源东西,我不会有这个错误的问题,因为我可以自己修复它,提供一个补丁,它很可能会进入进一步的版本。但这不是微软的工作方式。现在查看http://sourceforge.net/projects/dotnetftpclient/

于 2009-02-10T11:21:09.547 回答