Il server ha restituito un indirizzo in risposta al comando PASV che è diverso l'indirizzo al quale è stata effettuata la connessione FTP

StackOverflow https://stackoverflow.com/questions/2709498

Domanda

  

System.Net.WebException: Il server ha restituito un indirizzo in risposta al comando PASV che è diverso l'indirizzo al quale è stata effettuata la connessione FTP
.      a System.Net.FtpWebRequest.CheckError ()
     a System.Net.FtpWebRequest.SyncRequestCallback (Object obj)
     a System.Net.CommandStream.Abort (Exception e)
     a System.Net.FtpWebRequest.FinishRequestStage (stadio RequestStage)
     a System.Net.FtpWebRequest.GetRequestStream ()
     a BackupDB.Program.FTPUploadFile (String ServerPath, String serverFile, FileInfo localfile, NetworkCredential Cred) in D: \ PROJEKTI \ BackupDB \ BackupDB \ Program.cs: linea 119

codice:

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();
}
È stato utile?

Soluzione 2

se qualcuno ha lo stesso problema, questa è la soluzione per proftpd

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

Altri suggerimenti

omg. Che succede con tutte le assecondare qui per comprare le loro soluzioni 3rd party invece di informare per cambiare una riga di codice?

Prova commutando il valore passivo per vedere quale funziona:

    request.UsePassive = false;

Questo può dipendere dal firewall tra le macchine (client e server).

ho notato se vado attraverso il nostro firewall, allora ne ho bisogno a sinistra al vero, altrimenti restituirà l'eccezione:

  

Il server remoto ha restituito un errore: (500) Errore di sintassi, comando   non riconosciuta.

Tuttavia, se sto dietro il firewall (come due macchine che collegano direttamente l'uno all'altro all'interno di un data-center) poi ho bisogno di impostarlo su False, altrimenti restituirà l'eccezione:

  

Il server ha restituito un indirizzo in risposta al comando PASV che è diverso l'indirizzo al quale la connessione FTP era   fatto.

Se questo funziona e si desidera rendere la vostra soluzione più adattabile, si potrebbe avvolgere la vostra richiesta in un blocco try-catch utilizzando il valore vero di default, e se si ottiene l'errore 500, quindi passare UsePassive False e provare di nuovo .

In modalità passiva FTP conversazione va come segue:

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.

Sembra che il server FTP con due indirizzi IP pubblici (per esempio 1.2.3.4) restituisce un indirizzo IP privato come risposta al comando PASV.

Soluzione

Il passaggio alla modalità attiva.

Nella collega di server FTP in modalità attiva per client FTP per il trasferimento dei dati. Sarebbe risolvere questo problema, ma non è firewall amichevole. Non funzionerà quando le connessioni in arrivo sono bloccate (molto comune).

Ignorando l'indirizzo di invio IP come risposta al comando PASV

Se l'indirizzo IP del server FTP pubblico è un pubblico, e l'indirizzo IP restituito come risposta per il comando PASV è da gamma private (come ad esempio 10., 192.168.). In tal caso, il client FTP dovrebbe utilizzare l'indirizzo IP pubblico.

Questo è esattamente ciò che fa il nostro Rebex FTP fare in tale situazione. Funziona bene (questo comportamento può essere disattivato). Può essere anche attivata per server con più indirizzi IP pubblici.

Non so se la soluzione simile è possibile con FtpWebRequest.

Puoi download di prova e verificare se si risolve il problema .

Dopo un sacco di scavare intorno ho trovato l'unico modo per risolvere questo problema è stato quello di modificare le impostazioni PASV sul server.

Per fortuna ho controllare entrambe le macchine client e server quindi ero in grado di dire al server (FileZilla nel mio caso) per utilizzare l'IP pubblico piuttosto che l'IP privato.

Il server FTP è configurato correttamente.

Nella modalità passiva il server segnala un indirizzo IP e la porta a cui il client deve connettersi per un trasferimento di dati. Il server FTP segnala il proprio indirizzo IP all'interno di una rete interna, anche se è dietro un firewall / NAT. Il client non può connettersi a tale indirizzo interno per ovvie ragioni. È necessario configurare il server FTP per segnalare il proprio indirizzo IP esterno.

Come che è fatto è server specifico e non ci ha detto, che cosa il vostro server FTP è.


Alcuni risposta qui suggerire utilizzando la modalità attiva.

request.UsePassive = false;

Ma che può aiutare solo se non c'è firewall / NAT tra il client e il server, nel qual caso non avrete il problema, in primo luogo (a meno che il server è veramente rotto e riporta un indirizzo IP completamente sbagliato, non solo quella interna). Oppure, se il firewall / NAT è configurato per consentire le connessioni in entrata, ciò che non è usuale.


Un altro approccio utilizza una libreria FTP diverso che può aggirare il problema ignorando l'indirizzo IP non corretto riportato dal server e utilizzando l'indirizzo IP di connessione di controllo / primaria. Oppure utilizzando il comando EPSV al posto di comando PASV che implicitamente utilizza l'indirizzo di collegamento primario / controllo IP.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top