web-dev-qa-db-ja.com

リモートサーバーがエラーを返しました:227パッシブモードに入る(500 oops vs_utility_recv_peek:データなし)

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(つまり成功したもの)を使用したワイヤーキャプチャの画像です:

enter image description here

そして、パッシブをtrueに設定して、アプリを使用して接続(および失敗)したときのキャプチャを次に示します。

enter image description here

上記の失敗した接続でわかるように、サーバーに正常にログインできます。次に、何らかの理由で追加の要求、つまり「TYPE I」が送信され、「バイナリモードへの切り替え」の応答が求められます。その下に、私は以下を得る:

500 oops:vsf_sysutil_recv_peek:データなし

さらに、Passiveプロパティをfalseに設定した後、再度実行しました。これは、そのときに得たものです。

enter image description here

したがって、私の質問は2つあります。

1、どういうわけかUsePassiveの問題を乗り越えて、そのプロパティをfalseに設定した場合、問題は解決しますか?

2、UsePassiveプロパティを無視すると、アプリからファイルをダウンロードできないのに、他の場所からダウンロードできるのはなぜですか?

7
odinel

この問題は解決されました。接続をブロックしていたのは、Kasperskyの組み込みファイアウォールであることが判明しました。接続しようとしたときに警告が表示されなかったのは迷惑ですが、PCが安全であることを知って安心しました。

手がかりは227リターンの詳細にありました:

10051 –到達不能なネットワークに対してソケット操作が試行されました

また、Googleなどを介してこれに到達する人のために、リモートサーバーはパッシブ接続のみを許可するように構成されていたため、500構文エラーが発生していました。ファイルのダウンロード時にワイヤーキャプチャを調べると、アクティブが選択されているが失敗した場合、Filezillaは実際には自動的にパッシブモードに戻ることがわかりました。

私の元の投稿のコードは現在正常に機能しています。

10
odinel