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 を設定すると、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
}

このようにして、すべてが正常に機能します。

4

1 に答える 1

4

Wireshark を使用してトレースを実行します。ステータス コードは 503 ですが、メッセージは別のものである可能性が高くなります。私の場合、FtpWebRequest は USER xyz で 3 リクエストごとに再認証していたため、サーバー (ProFTPD) は「503 You are already login」と応答し、FtpWebRequest が救済されました。これが発生する理由については、Microsoft によるフィードバック ( http://social.msdn.microsoft.com/Forums/en-US/netfxnetcom/thread/9f0510f9-fa39-4aa4-8bd5-afb926282144/ ) を参照してください。Microsoft が (適切に) オープン ソース化するなら、私はこのバグの問題を抱えていないでしょう。しかし、それはマイクロソフトのやり方ではありません。http://sourceforge.net/projects/dotnetftpclient/を調べています。

于 2009-02-10T11:21:09.547 に答える