2014-06-13 13 views
5

Ho riscontrato un problema nel connettere un servizio Windows a un sito FTP.Il server remoto ha restituito un errore: 227 Immissione della modalità passiva (500 oops vs_utility_recv_peek: nessun dato)

Ho ereditato un servizio Windows da un altro sviluppatore. Il servizio si collega a un server di terze parti, scarica un file CSV e quindi lo elabora. Per qualche ragione, il servizio ha smesso di funzionare (ben più di un anno fa, prima che mi fosse dato il progetto).

Così sono tornato alle origini, ho creato un'app per console e ho provato la funzione di connessione/download file solo in quell'app. Ho provato molti metodi diversi per la connessione a FTP, ma tutti loro tornare lo stesso errore per la mia domanda:

The remote server returned an error: 227 Entering Passive Mode()

Questo è uno dei tanti metodi che ho provato:

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(); 

ma cade su questa parte:

FtpWebResponse response = (FtpWebResponse)request.GetResponse(); 

ho letto in diversi forum che l'impostazione della proprietà UsePassive alle correzioni falsi questi errori, ma tutto ciò che mi è successo è stato che ho avuto un errore di sintassi, invece, come di seguito:

The remote server returned an error: (500) Syntax error, command unrecognized.

Il file è ospitato su un server di terze parti FTP non ho alcun controllo. Posso incollare l'URL in un browser e mi viene richiesto un nome utente e una password, che quindi mi consente e posso scaricare il file.

Per eliminare il firewall come causa del problema, ho eseguito l'app sia sulla rete interna che sul WiFi (che non è dietro il firewall) e non fa alcuna differenza. Ho anche collegato tramite FileZilla in modalità predefinita, attiva e passiva, e ha funzionato ogni volta. Quindi nessun problema lì.

Quindi ho eseguito Wireshark. Ecco un'immagine della cattura filo usando Filezilla (cioè un successo uno), in modalità passiva:

enter image description here

Ed ecco la cattura durante la connessione (e non) utilizzando l'applicazione, con il set passivo true :

enter image description here

Quindi, come potete vedere nel mancato collegamento di cui sopra, posso accedere al server di bene. Quindi, per qualsiasi motivo, viene inviata una richiesta aggiuntiva, ovvero "TYPE I", che richiede la risposta di "Passaggio alla modalità binaria". Il seguito che, ottengo il seguente:

500 oops: vsf_sysutil_recv_peek: no data

Inoltre, ho anche eseguito di nuovo dopo l'impostazione della proprietà passiva al falso, e questo è ciò che ho ottenuto quel tempo:

enter image description here

Quindi la mia domanda è duplice;

1, se in qualche modo riesco a superare il problema UsePassive e impostare quella proprietà su false, questo risolverà il mio problema?

2, ignorando la proprietà UsePassive, perché non è possibile scaricare il file dall'app, ma da qualsiasi altro luogo?

+0

Sì, se usi UsePassive = false dovrebbe scomparire tutti i codici 2xx ** non sono errori ** quindi suppongo che sia un errore nel codice .NET (l'errore è un'altra cosa ma riporta l'ultima operazione eseguita). –

+0

Grazie per la risposta. So che il 227 non è un codice di errore, quindi presumo che l'app .NET restituisca quella che era l'ultima risposta riuscita dal server. Il mio codice .net è in cima. Qualcosa ti salta come sbagliato? Ho provato molti metodi diversi oggi, ma tutti loro fanno la stessa cosa. – odinel

+0

No, niente sembra sbagliato (ma proverei ad aggiungere request.UseBinary = true, sia con che senza UsePassive). Sembra un errore del server (o un errore del client a causa del firewall quando si tenta di stabilire una connessione TCP?) –

risposta

10

Il problema è stato risolto. Si è rivelato essere il firewall integrato di Kaspersky che stava bloccando la connessione. È fastidioso che non mi abbia presentato un avvertimento quando ho provato a collegarmi, ma rassicurante sapere che il mio PC è sicuro.

L'indizio era in dettaglio del 227 ritorno:

10051 – A socket operation was attempted to an unreachable network

Inoltre, per chiunque raggiungere questo tramite Google ecc, il server remoto è stato configurato in modo da consentire solo connessioni passive, che è il motivo per cui mi è stato sempre il 500 errore di sintassi. Lo studio di un'acquisizione di Wire durante il download di un file ha rivelato che Filezilla ritorna automaticamente alla modalità Passiva se Active è selezionato ma non riesce.

Il codice nel mio post originale funziona bene ora.

+0

quindi cosa dovrei fare con kaspersky? –

+0

Stavo avendo lo stesso problema, ma non era Kaspersky, era IIS 8.5. Ho dovuto riavviare il servizio FTP utilizzando la risposta qui per risolvere il problema: http://serverfault.com/questions/309964/why-doesnt-iis-7-5-ftp-respect-the-passive-port-range- per-plain-ftp – LandonC

Problemi correlati