Il server ha restituito un indirizzo in risposta al comando PASV che è diverso l'indirizzo al quale è stata effettuata la connessione FTP
-
01-10-2019 - |
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();
}
Soluzione 2
se qualcuno ha lo stesso problema, questa è la soluzione per proftpd
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 è.
- IIS: In Gestione IIS , aperto FTP> FTP Firewall Support . Vedere la sezione server dietro esterna Firewall / NAT nella mia guida su l'installazione di IIS Server server
- FileZilla FTP: Vai a Modifica> Impostazioni> Impostazioni modalità passiva> IPv4 specifico> Indirizzo IP server esterno per i trasferimenti in modalità passiva . Vedere server FTP in esecuzione sulla porta 2000 Oltre il NAT non funziona la modalità passiva .
- ProFTPD:. Usa
MasqueradeAddress
direttiva - vsftpd:.
pasv_address
direttiva
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.