WindowsサービスをFTPサイトに接続する際に問題が発生しました。
別の開発者からWindowsサービスを継承しました。このサービスはサードパーティのサーバーに接続し、csvファイルをダウンロードして処理します。なんらかの理由で、サービスが機能しなくなりました(1年以上前、私がプロジェクトを提供される前)。
そこで、基本に戻り、コンソールアプリを作成し、そのアプリでのみ接続/ファイルダウンロード機能を試してみました。 FTPに接続するためにさまざまな方法を試しましたが、すべて同じエラーがアプリケーションに返されます。
リモートサーバーがエラーを返しました:227パッシブモードに入る()
これは私が試した多くの方法の1つです。
FtpWebRequest request = (FtpWebRequest)WebRequest.Create("ftp://ftpaddress/filename.csv");
request.Method = WebRequestMethods.Ftp.DownloadFile;
request.Credentials = new NetworkCredential("username", "password");
request.UsePassive = true;
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Stream responseStream = response.GetResponseStream();
StreamReader reader = new StreamReader(responseStream);
Console.WriteLine(reader.ReadToEnd());
Console.WriteLine("Download Complete, status {0}", response.StatusDescription);
reader.Close();
response.Close();
しかし、それはこの部分に当てはまります:
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
UsePassiveプロパティをFalseに設定するとこれらのエラーが修正されることをいくつかのフォーラムで読みましたが、私に起こったのは、以下のように、代わりに構文エラーが発生したことだけでした。
リモートサーバーがエラーを返しました:(500)構文エラー、コマンドが認識されません。
このファイルは、私が制御できないサードパーティのFTPサーバーでホストされています。 URLをブラウザに貼り付けると、ユーザー名とパスワードの入力を求められます。これにより、ファイルをダウンロードできます。
問題の原因であるファイアウォールを排除するために、内部ネットワークとWiFi(ファイアウォールの背後にない)の両方でアプリを実行しましたが、違いはありません。また、FileZillaを介してデフォルト、アクティブ、パッシブモードで接続しましたが、毎回機能しました。だから問題ありません。
そこで、Wiresharkを実行しました。これは、パッシブモードでFilezilla(つまり成功したもの)を使用したワイヤーキャプチャの画像です:
そして、パッシブをtrueに設定して、アプリを使用して接続(および失敗)したときのキャプチャを次に示します。
上記の失敗した接続でわかるように、サーバーに正常にログインできます。次に、何らかの理由で追加の要求、つまり「TYPE I」が送信され、「バイナリモードへの切り替え」の応答が求められます。その下に、私は以下を得る:
500 oops:vsf_sysutil_recv_peek:データなし
さらに、Passiveプロパティをfalseに設定した後、再度実行しました。これは、そのときに得たものです。
したがって、私の質問は2つあります。
1、どういうわけかUsePassiveの問題を乗り越えて、そのプロパティをfalseに設定した場合、問題は解決しますか?
2、UsePassiveプロパティを無視すると、アプリからファイルをダウンロードできないのに、他の場所からダウンロードできるのはなぜですか?
この問題は解決されました。接続をブロックしていたのは、Kasperskyの組み込みファイアウォールであることが判明しました。接続しようとしたときに警告が表示されなかったのは迷惑ですが、PCが安全であることを知って安心しました。
手がかりは227リターンの詳細にありました:
10051 –到達不能なネットワークに対してソケット操作が試行されました
また、Googleなどを介してこれに到達する人のために、リモートサーバーはパッシブ接続のみを許可するように構成されていたため、500構文エラーが発生していました。ファイルのダウンロード時にワイヤーキャプチャを調べると、アクティブが選択されているが失敗した場合、Filezillaは実際には自動的にパッシブモードに戻ることがわかりました。
私の元の投稿のコードは現在正常に機能しています。