要获取文件列表中每个文件的文件大小,我使用以下代码:
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
}
这样,一切都像它应该的那样工作。