ファイルのリスト内のすべてのファイルのファイル サイズを取得するために、次のコードを使用しています。
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 を設定すると、2 番目の要求でエラー 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
}
このようにして、すべてが正常に機能します。