5

zipファイルをftpサーバーにアップロードするコードを書いています。驚くべきことに、コードは小さなファイルでは正常に機能しますが、大きなファイルでは問題が発生します。Streamオブジェクトを使用していますが、Streamを閉じようとしているときにコードがスタックしていることに気付きました(大きなファイルの場合のみ)。ストリームを閉じない場合(大きなファイルの場合でも)、コードは正常に実行されます。なぜこれが起こっているのか、誰かが論理を見ていますか?また、ストリームを閉じないと、将来問題が発生する可能性があります。

コード抽出:

FtpWebRequest reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri(@"ftp://" + ftpServerIP + @"/" + fileInf.Name));
Stream strm = reqFTP.GetRequestStream();

コードは次の場所で応答を停止します(アップロードファイルが大きい場合)。

strm.Close();

この部分はtry-catch内にあるため、例外はありません。

スタックトレースを取得する方法がわかりません。

4

2 に答える 2

6

ストリームを閉じるときにどのようなエラーが発生するかは具体的にはわかりませんが、このアプリケーションでは、大量の大きなファイル(ビデオと画像)をアップロードします。FTPストリームへの書き込み方法は次のとおりです。

request.KeepAlive = false; // This eliminated some of our stream closing problems

using (Stream stream = request.GetRequestStream())
{
    stream.Write(file.Data, 0, file.Data.Length);
}

usingブロックを実行するCloseと、それ自体で効果的に呼び出しを実行できると思いましたが、他の必要なクリーンアップも実行する可能性があります。また、FTPキープアライブをオフにしたため、アップロードしたサードパーティのFTPサイトの一部で問題が発生したことにも注意してください。

すべての例外を飲み込むのではなく、実際に受け取っている特定の例外を確認する必要があります。エラーメッセージは、ほとんどの場合、何が問題なのかを示します。私たちが遭遇した最も一般的な問題は、アクティブモードとパッシブモード、およびキープアライブに関係していました。

編集:

CDNでFTPの問題が発生したときに実際に何が起こっていたかを発見するために(そしてそれはあまりにも頻繁に発生します)、アプリケーションでトレースをオンにする必要がある場合がありました。トレースを有効にする方法の詳細については、このリンクを参照してください。もう1つのオプションは、Wiresharkなどのツールを使用して、アプリケーションとFTPサーバー間の会話をスニッフィングすることです。FTPプロトコルで何が起こっているかを確認できれば、問題を解決できる可能性がはるかに高くなります。

于 2010-02-16T01:37:39.323 に答える
0

ここからオープンソースFTPコンポーネントを試してみる価値があるかもしれません...私はFtpWebRequestを使用してみましたが、それを使用した経験は否定的でした...非常に自然に、FtpWebRequestはポート80を介して機能するため、時間がかかり、タイムアウトしますネイティブポート21の代わりに...このFTPコンポーネントを使用すると、状況は非常に劇的に変化し、より用途が広く強力になりました...

編集:ジェイコブが私の明らかなエラーとFtpWebRequestクラスの非論理的な見方を指摘したように、ファンキーで奇妙なことが起こっていると信じさせ、HTTPを介して何かをしていると信じさせました...ジェイコブにはポイントが必要です。 。フレームワーク内の悪い命名規則の典型的なケース...Jacobに感謝します!

これがお役に立てば幸いです、よろしく、トム。

于 2010-02-16T01:50:06.187 に答える