C#でWebClientを使ってFTP送信した際、
レスポンスが遅かったり例外が発生したりすることがあります。
FTPはいろんな設定等があって難しいのですが、あちこち調べて作ったモジュールが下記です。
WebClientなので、Passiveモード+KeepAlive有効だと思いますが、
そこらに問題があるのかと推測しつつよく分かりません。
どのような改善点がありますでしょうか。
因みに、接続先FTPサーバーは、OCNの「Bizメール&ウェブ ビジネス」というものです。
ご教授よろしくお願いします。
現象
下記使用モジュールにあるようなクラスを作り、その中のメソッドを使ってFTP送信をしています。
メソッドは4つのスレッドA,B,C,Dから呼ばれます。
スレッドA,B,Cは10秒毎にそれぞれ150KB程度のファイルを1つ送信します。
スレッドDは60秒毎に40KB程度のファイルを1つx30回(合計30)送信します。
スレッドから呼びますが、下記メソッド部分は排他され、同時並行に実行はされません。
(従いまして、下記メソッドは常に1ファイルのみ送信します。)
大抵は上手くいくのですが、少なければ数時間毎、多ければ10数分毎に、
次の2つの現象のいずれかが発生します。
(現象1)
下記メソッドの webClient.UploadFile からの復帰が、
上手くいくときはあっという間に終わるものが、10秒前後かかる。
(現象2)
下記例外が発生する。
使用モジュール
static class TESTFTP
{
. static NetworkCredential _cred = null; // FTP認証情報
. // 使用メソッド
. public static void WebClientSend(string url,
. string id, string password,
. string serverDir,
. string[] fullFileNames, string[] fileNames)
. {
. string uri = "";
. try {
. if (_cred == null) {
. _cred = new NetworkCredential(id, password);
. }
. using (WebClient webClient = new WebClient()) {
. webClient.Credentials = _cred;
. webClient.Proxy = null;
. for (int i = 0; i < fullFileNames.Length; i++) {
. uri = "ftp://" + url + "/";
. uri += serverDir + "/";
. uri += fileNames[i];
. webClient.UploadFile(uri, fullFileNames[i]);
. }
. }
. }
. catch(WebException webex) {
. throw;
. }
. catch(Exception ex) {
. throw;
. }
. }
}
###例外メッセージ
要因=System.Net.WebException: FTP送信エラー(ftp://.../www/htdocs/data/data.txt) ---> System.Net.WebException: リモート サーバーがエラーを返しました: 227 Entering Passive Mode (,,,,195,100.
---> System.Net.Sockets.SocketException: 接続済みの呼び出し先が一定の時間を過ぎても正しく応答しなかったため、接続できませんでした。または接続済みのホストが応答しなかったため、確立された接続は失敗しました。 ...:50020
場所 System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress)
場所 System.Net.Sockets.Socket.Connect(EndPoint remoteEP)
場所 System.Net.FtpControlStream.QueueOrCreateDataConection(PipelineEntry entry, ResponseDescription response, Boolean timeout, Stream& stream, Boolean& isSocketReady)
場所 System.Net.FtpControlStream.PipelineCallback(PipelineEntry entry, ResponseDescription response, Boolean timeout, Stream& stream)
場所 System.Net.CommandStream.PostReadCommandProcessing(Stream& stream)
場所 System.Net.CommandStream.PostSendCommandProcessing(Stream& stream)
場所 System.Net.CommandStream.ContinueCommandPipeline()
場所 System.Net.CommandStream.SubmitRequest(WebRequest request, Boolean async, Boolean readInitalResponseOnConnect)
場所 System.Net.FtpWebRequest.TimedSubmitRequestHelper(Boolean async)
場所 System.Net.FtpWebRequest.SubmitRequest(Boolean async)
--- 内部例外スタック トレースの終わり ---
場所 System.Net.WebClient.UploadFile(Uri address, String method, String fileName)
場所 System.Net.WebClient.UploadFile(String address, String fileName)
--- 内部例外スタック トレースの終わり ---
メッセージ=リモート サーバーがエラーを返しました: 227 Entering Passive Mode (,,,,195,100).

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/08 03:01
2016/11/08 04:00
2016/11/08 04:17
2016/11/08 04:21
2016/12/07 06:57
2016/12/07 07:29 編集
2016/12/07 07:33
2016/12/07 07:35
2016/12/07 07:51
2016/12/07 07:54
2016/12/07 07:55
2016/12/07 08:14
2016/12/09 03:56
2016/12/09 03:58
2016/12/09 04:10
2016/12/09 05:55