2

C#を使用してファイルをFTPサーバーにアップロードしています。ファイルがすでに存在する場合、FtpWebRequestがタイムアウトしたので、最初にそれを削除することを考えました。

ただし、WebRequestMethods.Ftp.DeleteFileも常にタイムアウトします。私は何か間違ったことをしていますか?

これが私のコードです:

FtpWebRequest request = (FtpWebRequest)FtpWebRequest.Create(address);

request.Credentials = new NetworkCredential(Username, Password);
request.KeepAlive = false;
request.Method = WebRequestMethods.Ftp.DeleteFile;

try
{
    FtpWebResponse resp = (FtpWebResponse)request.GetResponse();
}
catch (Exception e)
{
    ...         
}

編集:ああ、それは私が削除しようとしている魔女のファイルは関係ありません。ファイルが存在する限り、リクエストは常にタイムアウトになります。ファイルが存在しない場合は、別の例外がスローされます。

クレデンシャルに問題はありません。他の操作を実行できます(問題なくアップロード/ダウンロード)。また、サーバーの問題ではありません。同じユーザー名/パスを使用してクライアント(FileZilla)で接続すると、すべてが正常に機能します。

ご協力ありがとうございました。

4

3 に答える 3

1

FtpWebRequestを介してこのFtpを使用していることを私が見つけたのは、本質的に非常に遅いことです(ポート80を介してHTTPプロトコルを使用しているため)、FileZillaはそれをはるかに高速に実行できるため(明らかにFTPプロトコルを使用してポート20/21)。ここにオープンソースのftpコンポーネントがあります。それがあなたのために機能するかどうかはわかりませんが、一見の価値があります。

私はこれが主観的な答えであることを知っていますが、個人的には、ポート80を介してftpを使用すると、特に達成しようとしているようなファイル操作ではかなり遅くなります。

于 2010-01-26T13:37:23.863 に答える
1

FTPサーバーのログにアクセスできますか?FTPWebRequestが実行しているコマンドを確認してください。ディレクトリを削除する前に一覧表示しようとしている可能性があります。

別の問題は、サーバーがパッシブモードになっていることかもしれません。FileZillaがこれを自動的に検出する可能性があると思います。filezillaで接続を確認してください。

于 2010-01-26T13:44:34.017 に答える
1

クライアントとFTPサーバー間で送信されるコマンドを知ることは、タイムアウトの原因を見つけるのに役立ちます。Etherealなどのパケットアナライザを使用して通信ログをキャプチャすることは可能でしょうか?

別のアプローチとして、サードパーティのFTPコンポーネントを使用し、そのコンポーネントへのログインを有効にすることができます。次のコードは、RebexFTPを使用しています。

// create client 
Ftp client = new Ftp();
// enable logging 
client.LogWriter = new Rebex.FileLogWriter(@"c:\temp\log.txt", Rebex.LogLevel.Debug); 

// connect
client.Connect("ftp.example.org");
client.Login("username", "password");

// browse directories, transfer files 
client.DeleteFile("file.txt");

// disconnect 
client.Disconnect();
于 2010-02-24T17:36:07.057 に答える