🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

Q&A

解決済

1回答

3631閲覧

FtpWebRequestでファイル取得時にPORTコマンドが文法エラーとなる

moche

総合スコア0

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

.NET Framework

.NET Framework は、Microsoft Windowsのオペレーティングシステムのために開発されたソフトウェア開発環境/実行環境です。多くのプログラミング言語をサポートしています。

0グッド

0クリップ

投稿2020/12/28 06:59

前提・実現したいこと

c#でLinuxサーバーからFTP(アクティブモード)でファイルを取得したいが、
特定のPCで、正常にファイルが取得できない。
同一のexeで、他のPCでは正常にファイルが取得できていることから、
環境に起因するものと思われる。

発生している問題・エラーメッセージ

Linuxサーバーから 500 コマンドの文法エラー が返ってくる

該当のソースコード

C#

1Uri u = new Uri("ftp://" + "対象サーバーのIPアドレス" + "対象のファイル"); 2string downFile = Program.loginDataFileName; 3System.Net.FtpWebRequest ftpReq = (System.Net.FtpWebRequest)System.Net.WebRequest.Create(u); 4ftpReq.Credentials = new System.Net.NetworkCredential("ユーザー名", "パスワード"); 5ftpReq.Method = System.Net.WebRequestMethods.Ftp.DownloadFile; 6ftpReq.KeepAlive = false; 7ftpReq.UseBinary = false; 8ftpReq.UsePassive = false; 9System.Net.FtpWebResponse ftpRes = (System.Net.FtpWebResponse)ftpReq.GetResponse();

試したこと

実際にLinuxサーバーとの間で飛んでいるパケットをキャプチャしたところ、
ポートを指定するコマンドが
PORT 127,0,0,1,194,79
となっており、意図しているIPアドレスとなっていませんでした。(実際のPCのIPは192.168.xx.xxというIP)

Windowsのコマンドプロンプトからftpコマンドを手動で実行したところ
問題なく対象のファイルは取得できました。

ファイアウォールを一時的に無効にしても、現象は変わりませんでした。

補足情報(FW/ツールのバージョンなど)

問題の起きるクライアントPC
・Windows10 Pro(バージョン:1909)
・.NET Framework 4.8

アプリケーション
・C#(VisualStudio2015で作成、ソリューションのプロパティ上の対象のフレームワークは「.NET Framework 4.5.1」

Linuxサーバー
・CentOS6(RHEL5.0でも同様でした)
・vsftpd2.2.2(2.0.5でも同様でした)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/12/28 07:27

Microsoftは、新規開発でのFtpWebRequestの使用を推奨していないので、FluentFTP等の代替ライブラリを検討してみてください。 https://www.nuget.org/packages/FluentFTP/
moche

2020/12/28 07:41

回答ありがとうございます。 今回問題の起きているプログラムは前任者が開発し、 既にサービスインしているものでして、 FtpWebRequestを使わないように修正するとしても、 どのような環境でファイル取得ができなくなるのか等の情報を整理しなくてはいけない状況です。 また、該当の事象が起きるのが顧客のPCのみで、 こちらの開発環境では事象が再現していないため、 FluentFTP等のライブラリを使用した際に 該当の事象が起きないという検証ができない(対象のPCではFluentFTPも動かない可能性が残る)ため、 該当の事象が起きる理由と対策をある程度明確にしたいと考えています。 こちらの都合ばかり書いて申し訳ありません。 対策として、FluentFTPに変更することも、検討致します。
退会済みユーザー

退会済みユーザー

2020/12/28 08:05

> また、該当の事象が起きるのが顧客のPCのみで、こちらの開発環境では事象が再現していないため ここが少し引っかかるんですが、同じFTPサーバに対して、同じネットワーク内で検証を行ったのでしょうか?
moche

2020/12/28 08:24

はい、同じサーバーに対して、同じネットワークで検証を行っています。 社内の開発環境(テスト用PCとテスト用サーバー)では事象が再現しなかったため、 一時的に顧客PCを自社に持ち帰り、自社のテストサーバーとつないだところ、 事象の再現を確認した、という状況です。
退会済みユーザー

退会済みユーザー

2020/12/28 08:29 編集

パケットキャプチャでIPが異なっているということなので、Uriに渡されている文字列もログ出力してチェックしてみた方がいいかもしれませんね。 また、本番のソースとは別に、Ftp接続してダウンロードするだけの必要最小限のコードのサンプルアプリを作成し、FtpWebRequestとFluentFTPでPC毎の挙動の差を確認してみるといいかもしれません。
moche

2020/12/28 08:54 編集

> パケットキャプチャでIPが異なっているということなので、Uriに渡されている文字列もログ出力してチェックしてみた方がいいかもしれませんね。 "対象サーバーのIPアドレス" "対象のファイル" となっている、二つの文字列についてということですね? キャプチャ上は、対象のサーバーとTCPコネクションは確立できているため、 "対象サーバーのIPアドレス"は意図通りの文字列を渡せていると思われます。 今回意図していないIPとなっているのは、 サーバーからのデータ転送を受け付けるポートを指定しているコマンド(PORT)の、 IPを指定する箇所(PC側のIPアドレスが入るべき)が、意図しないIP(127.0.0.1)になっている、という状況です。 ソース上、PCのIPアドレスは指定していないため、 FtpWebRequestが環境から取得してきてくれるものかと思っているのですが。 ”対象のファイル"のパスは、ソースにべた書きで、 他のPCでは意図通りの動作をしているため、バグる可能性は低いと思いますが、 確認観点として追加します。ご指摘ありがとうございます。 > また、本番のソースとは別に、Ftp接続してダウンロードする必要最小限のコードのサンプルアプリを作成し、FtpWebRequestとFluentFTPでPC毎の挙動の差を確認してみるといいかもしれません。 ご提案ありがとうございます。 FtpWebRequestとFluentFTPでサンプルプログラムを作り、 もし可能であれば、顧客PCでも確認させてもらえないか、交渉してみます。
guest

回答1

0

自己解決

解決ではありませんが、
該当のPCにファイアウォールとは別に、
webフィルターというソフトがインストールされていたことが原因でした。
そのソフトをアンインストールすることで、意図通りの通信ができました。
直接の解決ではありませんが、事象はわかったためクローズとします。

投稿2021/01/19 03:58

moche

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問