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

FTP通信時のフレームワークによる差異

環境/言語:[Windows 7 Pro, Visual Studio 2010 C#, .NetFramwork 4.0]
分類:[.NET]

お世話になります。
以下の質問をさせて頂きます。

http://dobon.net/vb/dotnet/internet/ftpwebrequest.htmlを参考に
FTPのテストプログラムを作成しました。
※添付ファイルにソースがあります。

.NET Framework 3.5で動作させるとディレクトリ移動は動作したのですが
.NET Framework 4.0に変更するとディレクトリの移動が動作しなくなってしまいました。
原因は内部的に保持しているカレントディレクトリ文字列が正常に
格納されていませんでした。
そもそもWebRequestMethodsの中に、ディレクトリ移動のコマンドがないので
ディレクトリの移動をクラス内で擬似的に作っているのがいけないのでしょうか?
Frameworkの仕様が変更になったのでしょうか?
また、ディレクトリの移動をせずに、パスを直接指定(絶対パス)してファイルのダウンロード等は正常に動作しています。

また、パケットモニタでデータのやり取りを確認したところ
3.5と4.0で以下のような差異がありました。
PrintWorkingDirectoryの通信を実行した際に、通信のやり取りが4.0では
CWDコマンドの送信が一回少なかった。
詳しくは添付ファイルを参照ください。

何かわかる方いらっしゃいましたらご教示のほどよろしくお願いいたします。
添付ファイル: 1368502445.zip (95 KB)
2013/05/15(Wed) 07:29:23 編集(投稿者)

■No31533に返信(Zergさんの記事)
> そもそもWebRequestMethodsの中に、ディレクトリ移動のコマンドがないので
> ディレクトリの移動をクラス内で擬似的に作っているのがいけないのでしょうか?

はい。
ドキュメントで保障されていない部分である振る舞いを元に作り込んだ結果、内部実装の変更によって動かなくなったと考えられます。

> Frameworkの仕様が変更になったのでしょうか?

違います。
あなたが前提としているのは「振る舞い」(実装)であり、仕様ではありません。
実際、ディレクトリパスを指定し、そのレスポンスの取得で PWD の結果が入ってくることはドキュメントに記述があるわけではなく、仕様未定義の事柄です。
実装・振る舞いが変更になったかもしれませんが、仕様は未定義のまま、変更ありません。


結局のところ、ドキュメントに保障がないことに頼って設計・実装した結果、将来のフレームワークの更新によって影響を受けることは十分あり得るので、そういったリスクを受容した開発をするか、ないものを無理矢理作ることを避ける(リスクの回避)をするかといったところでしょうか。

// .NET 3.5.1 と 4 で _FtpControlStream.BuildCommandList は結構変わっていそう。
// (FtpWebRequest が内部で呼び出しているメソッド)
ところで、このクラス、サーバー側のカレントディレクトリと _currentDirectory を一致させる必要はあるのでしょうか?
個人的には、サーバーから取得した _currentDirectory を代入するのではなく、ChangeDirectory で設定しようとしていたカレントディレクトリを覚えておけば、このクラスとしては十分なのかなと思っています。

利用者からはカレントディレクトリを変えたかのように振る舞えますし、FtpWebRequest に対してはフルパスで渡すので .NET 3.5/4 の違いを吸収できるのではないでしょうか。
2013/05/15(Wed) 16:32:20 編集(投稿者)

■No31536に返信(Azuleanさんの記事)

Azuleanさん

ご回答ありがとうございます。

>ところで、このクラス、サーバー側のカレントディレクトリと _currentDirectory を一致させる必要はあるのでしょうか?
一致させる必要は全くありません。
ご指摘の通り、設定しようとしていたカレントディレクトリを覚えておくで問題はなさそうです。

修正方針までご提示いただきありがとうございます。
解決済み!

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