Error connecting to ftp using proxy c #

0

I have an application that connects to an ftp, however when I try to connect using proxy authentication I get an error.

O servidor remoto retornou um erro(514). Proxy retornou um erro.

This is the method that gives the error.

public string[] GetFileList()
        {
            StringBuilder result = new StringBuilder();
            FtpWebRequest reqFTP;
            try
            {
                reqFTP = (FtpWebRequest)FtpWebRequest.Create(new Uri("ftp://" + _ftpServerIP + "/"));
                reqFTP.UseBinary = true;
                reqFTP.Credentials = new NetworkCredential(_ftpUserID, _ftpPassword);
                reqFTP.Method = WebRequestMethods.Ftp.ListDirectory;
                if (usaProxy)
                {
                    WebProxy proxy = new WebProxy("ip", "porta");
                    proxy.Credentials = new NetworkCredential("usuario", "senha");

                    reqFTP.Proxy = proxy;

                }
                WebResponse response = reqFTP.GetResponse(); // aqui ele vai pra excessao.
                StreamReader reader = new StreamReader(response.GetResponseStream());
                //MessageBox.Show(reader.ReadToEnd());
                string line = reader.ReadLine();
                while (line != null)
                {
                    result.Append(line);
                    result.Append("\n");
                    line = reader.ReadLine();
                }
                result.Remove(result.ToString().LastIndexOf('\n'), 1);
                reader.Close();
                response.Close();
                //MessageBox.Show(response.StatusDescription);
                return result.ToString().Split('\n');
            }
            catch (WebException e)
            {
                throw new Exception(e.Message + "\n" + e.Status + "\n" + e.StackTrace);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
        }
    
asked by anonymous 22.07.2016 / 16:00

1 answer

1

@Jeterson Miranda, Good evening.

I am creating an application connection with FTP, however I did not use proxy, but it was as follows and it worked. Analyze the code and if possible do some testing, maybe meet your need.

Follow the code below:

   public static void ListaArquivosDiretorio(string pstrUrlFtp, string pstrNomePastaFtp, string pstrUsuario, string pstrSenha, string pstrLocalDestino)
    {
        List<string> listArquivos = new List<string>();

        // Cria comunicação com o servidor e definir o diretório a ser listado através da URL qu está sendo passada junto com nome da pasta
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(string.Concat(pstrUrlFtp, pstrNomePastaFtp));

        // Define qual a ação que será usada para listar o diretório
        request.Method = WebRequestMethods.Ftp.ListDirectory;

        // Credenciais para o login (usuario, senha)
        request.Credentials = new NetworkCredential(pstrUsuario, pstrSenha);

        // Modo passivo
        request.UsePassive = true;

        // Dados binários
        request.UseBinary = true;

        // Setar o KeepAlive para true
        request.KeepAlive = true;

        using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
        {
            // Criando a Stream para pegar o retorno
            using (Stream responseStream = response.GetResponseStream())
            {
                using (StreamReader reader = new StreamReader(responseStream))
                {
                    // Adicionar os arquivos na lista
                    listArquivos = reader.ReadToEnd().Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList<string>();
                }
            }
        }

        int index = default(Int32);
        string strNomeArqTxt = default(String);

        // É executado o download de um arquivo por vez da lista dos arquivos
        foreach (string caminhoDirFtp in listArquivos)
        {
            // Verificação feita para separar o nome do arquivo do diretório completo
            if (caminhoDirFtp.Contains('/'))
            {
                index = caminhoDirFtp.IndexOf('/');

                strNomeArqTxt = caminhoDirFtp.Substring(++index);

                // Executa o download dos arquivos que estiverem no FTP, será baixado um arquivo por vez até que todos tenham sido baixados
                StartDownloadFile(string.Concat(pstrUrlFtp, "/", caminhoDirFtp), pstrUsuario, pstrSenha, strNomeArqTxt, pstrLocalDestino);

                // Criando um objeto URI, e passando o mesmo como parâmetro para o método a seguir que irá enviar um comando para o FTP que deleta o arquivo
                Uri uri = new Uri(string.Concat(pstrUrlFtp, "/", caminhoDirFtp));

                // Método deleta o arquivo assim que o mesmo é baixo para uma pasta local
                DeleteFileOnServerFtp(uri, pstrUsuario, pstrSenha);
            }
        }
    }

    // Método que executa o download dos arquivos.
    private static void StartDownloadFile(string pstrCaminhoDirFtpCompleto, string pstrUsuario, string pstrSenha, string pstrNomeArtTxt, string pstrLocalDestino)
    {
        // Cria comunicação com o servidor e definindo o arquivo para download
        FtpWebRequest request = (FtpWebRequest)WebRequest.Create(pstrCaminhoDirFtpCompleto); // Exemplo: ftp://servidor.com.br/pasta/arquivo.txt

        // Define que a ação vai ser de download
        request.Method = WebRequestMethods.Ftp.DownloadFile;

        // Credenciais para o login (usuario, senha)
        request.Credentials = new NetworkCredential(pstrUsuario, pstrSenha);

        // Modo passivo
        request.UsePassive = true;

        // Dados binarios
        request.UseBinary = true;

        // Setar o KeepAlive para true
        request.KeepAlive = true;

        // Criando o objeto FtpWebResponse
        using (FtpWebResponse response = (FtpWebResponse)request.GetResponse())
        {
            // Criando a Stream para ler o arquivo
            using (Stream responseStream = response.GetResponseStream())
            {
                byte[] buffer = new byte[2048];

                // Definir o local onde o arquivo será criado.
                using (FileStream file = new FileStream(string.Concat(pstrLocalDestino, @"\", pstrNomeArtTxt), FileMode.Create))
                {
                    // Ler o arquivo de origem
                    int readCount = responseStream.Read(buffer, 0, buffer.Length);

                    while (readCount > 0)
                    {
                        // Escrever o arquivo
                        file.Write(buffer, 0, readCount);

                        readCount = responseStream.Read(buffer, 0, buffer.Length);
                    }
                }
            }
        }
    } 

That way I can connect and download the files.

I hope it helps.

    
22.07.2016 / 18:07