DOBON.NET DOBON.NETプログラミング掲示板過去ログ

FTPアクセスにおける設定について

環境/言語:[WindowsXP, C#, .NET Framework ver. 2.0.50727 SP2]
分類:[.NET]

いつも参考にさせていただいており、ありがとうございます。
下記、質問させてください。

「FtpWebRequest、FtpWebResponseクラスを使ってFTPサーバーにアクセスする」
の説明ページにおきまして、
下記項目の説明用コードは、KeepAlive、UsePassiveの設定が明記されて
おりません。
・「FTPサーバーのファイルの名前を変更する」
・「FTPサーバーのファイルやディレクトリを削除する」
・「FTPサーバーのファイルのサイズを取得する」
・「FTPサーバーのファイルのファイルの更新日時を取得する」
これらを単独で使用する場合も、KeepAlive、UsePassive設定は
明記すべきでしょうか、
または、これらの処理におきましては、KeepAlive、UsePassive設定は
意味をなさないでしょうか。

※FTPサーバーのファイルを削除する処理を行った後、
数分何もしない状態で、次にファイルリスト取得処理を行おうとすると、
確実に失敗してしまいます。
アクセスするURLを変更(相手が2台ありますので)してファイルリスト
取得処理を行い(ここではいずれも失敗します)、また最初のURLに戻って
ファイルリスト取得処理を処理を行いますと、正常に処理が行えるようです。
コードを確認したところ、KeepAliveが明示されていませんでしたので、
処理後も接続が残っており、タイムアウトでログアウトされてしまい、
このような症状になっているのかと推測しております。
■No26467に返信(suilenさんの記事)
> ※FTPサーバーのファイルを削除する処理を行った後、
> 数分何もしない状態で、次にファイルリスト取得処理を行おうとすると、
> 確実に失敗してしまいます。

  それは、FTPサーバー側の設定であり仕様です。
  よって、KeepAliveは無意味です。

  UsePassiveは、ActiveかPassiveかはアクセスするFTPサーバー
  の仕様に合わせて設定して下さい。

※ 低レベルでのソケット通信でFTPを行った場合は、いわゆる無通信
  時、セッションを維持するような仕掛けを盛り込んで切断されない様
  にする方法はありますが、FtpWebRequest、FtpWebResponseクラスを
  使った場合は、そういう仕掛けは内包されていなかったと思います。
  (未確認ですが・・・)

以上。参考まで
■No26475に返信(オショウさんの記事)
> ■No26467に返信(suilenさんの記事)
>>※FTPサーバーのファイルを削除する処理を行った後、
>> 数分何もしない状態で、次にファイルリスト取得処理を行おうとすると、
>> 確実に失敗してしまいます。
>   それは、FTPサーバー側の設定であり仕様です。
>   よって、KeepAliveは無意味です。

あれ。KeepAlive プロパティを設定するのは、クライアント側ですよね?
サーバー側からの無通信時切断時間は、サーバー側の設定でしょうけれども。


> ※ 低レベルでのソケット通信でFTPを行った場合は、いわゆる無通信
>   時、セッションを維持するような仕掛けを盛り込んで切断されない様
>   にする方法はありますが、FtpWebRequest、FtpWebResponseクラスを
>   使った場合は、そういう仕掛けは内包されていなかったと思います。

どぼん!さんのサンプルでは、ログアウト(QUIT)の代わりに、
"PWD" + KeepAlive = False を利用していましたが、同様に
"PWD" + KeepAlive = True を定期的に投げ続ければ、
NOOP の代わりになるかも?
ご回答頂きまして、ありがとうございます。

すみません、私の説明が悪かったのかもしれませんが、
現在、該当ページttp://dobon.net/vb/dotnet/internet/ftpwebrequest.htmlの
「FTPサーバーのディレクトリのファイル一覧を取得する」および
「FTPサーバーのファイルやディレクトリを削除する」項のC#記述を
ほぼベタ書きしています。
(URL、ユーザ名、パスワードは使用しているものに変更し、
ファイル取得法を ListDirectoryDetails → ListDirectory にし、
パッシブモード設定を ftpReq.UsePassive = true;
にしているほかは、まったく同じです。)

従いまして、ファイル一覧取得処理では常に、未接続状態から最初に
接続をしにいって、
ftpReq.KeepAlive = false;
の設定により、最後に接続をこちらから切っていると思うのですが、
ファイル削除の処理では、未接続状態から最初に接続をしにはいっていますが、
最後に上記切断処理を行っていないため、サーバ側で自動的に接続を
切断しているのかな、と考えております。
その後、再度のファイル一覧取得処理で、こちらから切断していない状況で
接続しにいくと、失敗しているようです。
(「基になる接続が閉じられました: 受信時に予期しないエラーが発生しました」
という、例外エラーが発生します。)

また、ファイル削除処理後、数分も間を置かずに(恐らくまだ接続されたままの
状態?)、再度ファイル一覧取得処理行いますと、成功するようなのですが、
間を置いて(サーバからの接続切断後?)処理を行うと失敗することから、
サーバ側で切断後、同じユーザに対する再接続処理に対して、
インターバルの設定か何かですぐには接続許可しないようにしているのかな、
とも考えております。
(このような、サーバ側が切断してから、そのユーザに再接続を認めるまでの
間隔を設定するようなことはできるのでしょうか?)

上記のような症状がありますので、まずは、ファイル削除処理後に
こちらから
ftpReq.KeepAlive = false;
を明記して、切断処理してはどうかと考えた次第です。

すぐに確認してみればよいのですが、現在、確認できる環境に居ませんので、
質問させて頂いております。
確認できる状況になりましたら、いろいろ試してみる予定です。
本件、まだ完全に解決しておりませんが、問題の根本はFTP通信そのものではなく、
記述そのものには問題ないようです。

但し、問題の回避策として、魔界の仮面弁士様のご回答内容にありました
>どぼん!さんのサンプルでは、ログアウト(QUIT)の代わりに、
>"PWD" + KeepAlive = False を利用していましたが、同様に
>"PWD" + KeepAlive = True を定期的に投げ続ければ、
>NOOP の代わりになるかも?
を参考にし、定期的な間隔でアクセスを行うことで、症状は軽減されました。

ご回答いただきまして、ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板