O servidor remoto retornou um erro: 227 Entrando no modo passivo (500 oops vs_utility_recv_peek: sem dados)
Estou tendo um problema ao conectar um serviço do Windows a um site FTP.
Eu herdei um serviço do Windows de outro desenvolvedor. O serviço se conecta a um servidor de terceiros, baixa um arquivo csv e depois o processa. Por alguma razão, o serviço parou de funcionar (há mais de um ano, antes de eu receber o projeto).
Então, voltei ao básico, criei um aplicativo de console e tentei a função de conexão / download de arquivo apenas nesse aplicativo. Eu tentei muitos métodos diferentes para conectar ao FTP, mas todos eles retornam o mesmo erro ao meu aplicativo:
O servidor remoto retornou um erro: 227 Entrando no modo passivo ()
Este é um dos muitos métodos que tentei:
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();
Mas cai nessa parte:
FtpWebResponse response = (FtpWebResponse)request.GetResponse();
Li em vários fóruns que a configuração da propriedade UsePassive como False corrige esses erros, mas tudo o que aconteceu comigo foi que eu recebi um erro de sintaxe, como abaixo:
O servidor remoto retornou um erro: (500) Erro de sintaxe, comando não reconhecido.
O arquivo está hospedado em um servidor FTP de terceiros sobre o qual não tenho controle. Posso colar o URL em um navegador e é solicitado um nome de usuário e senha, que me permitem passar e posso fazer o download do arquivo.
Para eliminar nosso firewall como a causa do problema, executei o aplicativo na rede interna e no WiFi (que não está atrás do firewall), e isso não faz diferença. Também me conectei através do FileZilla nos modos Padrão, Ativo e Passivo, e funcionou sempre. Portanto, não há problema.
Então, eu corri o Wireshark. Aqui está uma imagem da captura eletrônica usando o Filezilla (ou seja, uma bem-sucedida), no modo Passivo:
E aqui está a captura ao conectar (e falhar) usando o aplicativo, com o passivo definido como true:
Portanto, como você pode ver na conexão com falha acima, posso fazer login no servidor sem problemas. Então, por qualquer motivo, uma solicitação extra é enviada, ou seja, "TIPO I", que solicita a resposta de "Alternando para o modo binário". Abaixo disso, recebo o seguinte:
500 ops: vsf_sysutil_recv_peek: sem dados
Além disso, eu também a executei novamente depois de definir a propriedade Passive como false, e foi o que obtive naquele momento:
Então, minha pergunta é dupla;
1, se, de alguma forma, superar o problema UsePassive e definir essa propriedade como false, isso resolverá meu problema?
2, ignorando a propriedade UsePassive, por que não consigo baixar o arquivo do aplicativo, mas de qualquer outro lugar?