0

私はいくつかのデータをスクレイピングし、FtpWebRequest オブジェクトを使用して FTP ディレクトリにアップロードする小さなコンソール アプリを持っています - 非常に典型的です。

デバッガーでステップ実行している間、正常に動作しました。ファイルは正しいデータでリモート サーバーに書き込まれていました。次に、ブレークポイントを取り出してリッピングすると、データのないファイルが作成され、最終的にタイムアウトするまでハングしました。タイムアウト以外の例外は返されませんでした。ブレークポイントを元に戻しましたが、完全に機能しました。

デバッグの行為が一時停止を引き起こしていると考え、Thread.Sleep(10) を入れたところ、再び完全に機能しました。

これについての説明だけで満足しますが(ひどい慣習でない限り)、より良い方法についての提案もいただければ幸いです。サードパーティ製のコントロールは控えめにしか使用していないことに注意してください。

編集:物理ファイルを作成する必要はなく、ストリームを直接書き込むだけでよいことにも言及する必要があります。

関連するコードは次のとおりです。

        filePathAndName = new Uri(String.Format("{0}{1}_{2}.txt", Properties.Settings.Default.QTMFTPDirectory, 
            fileNamePrefix, DateTime.Now.ToString("MMddyyHHmmss")));
        fileContents = Encoding.UTF8.GetBytes(csv);

        request = (FtpWebRequest)WebRequest.Create(filePathAndName);
        request.Method = WebRequestMethods.Ftp.UploadFile;
        request.Credentials = new NetworkCredential(Properties.Settings.Default.FTPUserName, Properties.Settings.Default.FTPPassword);
        request.ContentLength = fileContents.Length;
        request.KeepAlive = false;

        try
        {
            using (Stream reqStream = request.GetRequestStream())
            {
                reqStream.Write(fileContents, 0, fileContents.Length);
                System.Threading.Thread.Sleep(10); // Won't work without this.
            }
        }
        catch (Exception ex)
        {
            LogError(ex);
        }

ありがとう!

4

1 に答える 1

0

手動で閉じてみてください。

reqStream.Close(); // Close

それでも問題が解決しない場合は、サーバーからの応答を取得してみてください。

GetResponse(); 

ソース:

http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.getrequeststream(v=vs.110).aspx

編集:

usingキーワードが接続を正しく閉じないことがあります。

于 2013-11-14T15:08:47.007 に答える