4

System.Net.WebException:サーバーがPASVコマンドに応答して、FTP接続が確立されたアドレスとは異なるアドレスを返しました。
System.Net.FtpWebRequest.CheckError()
at System.Net.FtpWebRequest.SyncRequestCallback(Object obj)
at System.Net.CommandStream.Abort(Exception e)
at System.Net.FtpWebRequest.FinishRequestStage(RequestStage stage)
at System.Net .FtpWebRequest.GetRequestStream()
at BackupDB.Program.FTPUploadFile(String serverPath、String serverFile、FileInfo LocalFile、NetworkCredential Cred)in D:\ PROJEKTI \ BackupDB \ BackupDB \ Program.cs:line 119

コード:

FTPMakeDir(new Uri(serverPath + "/"), Cred);
FtpWebRequest request = (FtpWebRequest)WebRequest.Create(serverPath+serverFile);
request.UsePassive = true;
request.Method = WebRequestMethods.Ftp.UploadFile;
request.Credentials = Cred;
byte[] buffer = new byte[10240];    // Read/write 10kb

using (FileStream sourceStream = new FileStream(
    LocalFile.ToString(), FileMode.Open))
{
    using (Stream requestStream = request.GetRequestStream())
    {
        int bytesRead;
        do
        {
            bytesRead = sourceStream.Read(buffer, 0, buffer.Length);
            requestStream.Write(buffer, 0, bytesRead);
        } while (bytesRead > 0);
    }
    response = (FtpWebResponse)request.GetResponse();
    response.Close();
}
4

5 に答える 5

8

ああ、神様。コードの 1 行を変更するように通知するのではなく、サード パーティのソリューションを購入するためのここでのすべての迎合はどうなっていますか?

Passive 値を切り替えて、どちらが機能するかを確認してください。

    request.UsePassive = false;

これは、マシン (クライアントとサーバー) 間のファイアウォールに依存する場合があります。

ファイアウォールを通過する場合は、True のままにする必要があることに気付きました。そうしないと、例外が返されます。

リモート サーバーがエラーを返しました: (500) 構文エラー、認識できないコマンド。

ただし、ファイアウォールの背後にいる場合 (データセンター内で 2 台のマシンが互いに直接接続している場合など)、False に設定する必要があります。そうしないと、例外が返されます。

サーバーは、PASV コマンドに応答して、FTP 接続が確立されたアドレスとは異なるアドレスを返しました。

これが機能し、ソリューションの適応性を高めたい場合は、デフォルトの True 値を使用してリクエストを try-catch ブロックにラップし、500 エラーが発生した場合は、UsePassive を False に切り替えて、もう一度試してください。

于 2012-10-11T23:00:22.503 に答える
3

パッシブ モードの FTP 会話は次のようになります。

client: PASV
(i would like to transfer files. Tell me which port and ip address should I use)

server: 227 Entering Passive Mode (172,16,3,4,204,173)
(ok, use port 52397 on IP address 172.16.3.4.)

client: connects to this IP address/port and starts data transfer.

2 つのパブリック IP アドレス (例: 1.2.3.4) を持つ FTP サーバーが、PASV コマンドの応答としてプライベート IP アドレスを返すようです。

解決

アクティブモードに切り替えます。

アクティブ モードでは、FTP サーバーはデータ転送のために FTP クライアントに接続します。これでこの問題は解決しますが、ファイアウォール フレンドリーではありません。着信接続がブロックされている場合は機能しません (非常に一般的です)。

PASV コマンドの応答として送信される IP アドレスを無視する

パブリック ftp サーバーの IP アドレスがパブリックで、PASV コマンドの応答として返される IP アドレスがプライベート範囲 (10.、192.168. など) の場合。このような場合、FTP クライアントはパブリック IP アドレスを使用する必要があります。

これはまさに、このような状況でRebex FTPが行うことです。うまく機能します (この動作はオフにすることができます)。複数のパブリック IP アドレスを持つサーバーに対しても有効にすることができます。

FtpWebRequest で同様の回避策が可能かどうかはわかりません。

試用版をダウンロードして、問題が解決するかどうかを確認できます。

于 2010-09-10T15:24:52.143 に答える
3

誰かが同じ問題を抱えている場合、これはproftpdの解決策です

http://www.proftpd.org/docs/howto/NAT.html

于 2010-04-27T08:47:13.440 に答える