Conectar FTP em Batch

43 views
Skip to first unread message

Décio Oliveira Paganotti

unread,
Aug 10, 2013, 1:26:23 PM8/10/13
to dynami...@googlegroups.com
Pessoal, boa tarde.

Criamos uma rotina que conecta a um ftp para leitura e envio de arquivos, porem quando colocamos para rodar em batch da o seguinte erro:

"A função 'InternetOpenA' na biblioteca DLL 'WinINet' causou uma exceção."

Alterei a propriedade runOn da classe WininetServer para Client e o erro muda para:

"A sessão personificada no servidor (RunAs) tentou invocar um método que está disponível somente para processamento no cliente."

Alguem ja passou por isso? 

Conseguem me ajudar?

Obrigado

Décio

Gustavo Bagno

unread,
Aug 10, 2013, 6:30:45 PM8/10/13
to dynami...@googlegroups.com
Décio,

O ideal é você criar uma classe nova que use as bibliotecas do .NET.
Poderia mostrar o trecho do código que você está utilizando?

Att,



--
Você está recebendo esta mensagem porque se inscreveu no grupo "Dynamics AX BR" dos Grupos do Google.
Para cancelar a inscrição neste grupo e parar de receber seus e-mails, envie um e-mail para dynamicsaxbr...@googlegroups.com.
Para postar neste grupo, envie um e-mail para dynami...@googlegroups.com.
Visite este grupo em http://groups.google.com/group/dynamicsaxbr.
Para obter mais opções, acesse https://groups.google.com/groups/opt_out.
 
 

Décio Oliveira Paganotti

unread,
Aug 11, 2013, 6:04:19 PM8/11/13
to dynami...@googlegroups.com
Gustavo, boa noite.

Segue momento em que é emitido o erro.

Obrigado pela ajuda.

Imagem inline 1
erro_wininet.jpg

Gustavo Bagno

unread,
Aug 12, 2013, 9:06:59 AM8/12/13
to dynami...@googlegroups.com
Décio,

Na minha opinião, existem formas mais fáceis de se fazer isto, como por exemplo utilizar as classes .NET, e não as DLLs diretamente.

Tente o seguinte código (Faça o teste em um Job mesmo):

    object                                          ftpo;
    object                                          ftpResponse;
    System.Net.FtpWebResponse      response;
    System.Net.FtpWebRequest        request;
    System.IO.StreamReader             reader;
    System.IO.StreamWriter              writer;
    System.IO.Stream                       requestStream;
    System.Net.NetworkCredential     credential;
    System.String                             line;
    ;
    new InteropPermission(InteropKind::ClrInterop).assert();
    ftpo = System.Net.WebRequest::Create(@"ftp://" + 'ftp.dominio.com.br');
    request = ftpo;
    request.set_KeepAlive(false);

    credential = new System.Net.NetworkCredential('usuario', 'senha');
    request.set_Credentials(credential);

    request.set_Timeout(10000);
    request.set_Method("NLST");
    response = request.GetResponse(); //Aqui o Ax irá obter a lista de arquivos

    reader = new System.IO.StreamReader(response.GetResponseStream());

    line = reader.ReadLine();
    while (!System.String::IsNullOrEmpty(line))
    {
        info(line.toString());
        line = reader.ReadLine();
    }
    reader.close();
    ftpo = null;
    request = null;
    if(response)
        response.close();

    CodeAccessPermission::revertAssert();





Como pode perceber, neste trecho não estou tratando exceções, mas acredito que se não esqueci de alguma referência, o código irá funcionar, e irá te retornar a listagem de arquivos do diretório FTP indicado no começo do código.

Para fazer o download dos arquivos, você precisa fazer algo similar, mas com o comando de DOWNLOAD (RETR no lugar de NLST), e indicar o nome completo do arquivo no caminho do FTP.

Qualquer dúvidas, nos comunique.

Abraço!

Att,

erro_wininet.jpg

Décio Oliveira Paganotti

unread,
Aug 12, 2013, 10:48:49 AM8/12/13
to dynami...@googlegroups.com
Bom dia Rodrigo e Gustavo.


Rodrigo,

Dentro do método internetOpen faz sim o dllInterop.


Gustavo,

Obrigado pelo envio. Vou realizar alguns testes hoje a tarde e lhe comunico. 

Procurando na net encontramos uma solução para o que temos hoje utilizando uma task do windows, que inicializa o AX, passo como parâmetro a classe/método que quero executar e depois fecho o AX. 

Vou analisar a melhor performance e depois compartilho com vocês.

Obrigado pela ajuda.

Abs.

Décio O Paganotti
erro_wininet.jpg

Gustavo Bagno

unread,
Aug 12, 2013, 2:41:47 PM8/12/13
to dynami...@googlegroups.com
Você não precisa fazer isto.

Pode criar uma classe e rodar em Lote, utilizando as classes que te passei acima.
Desta forma ele fica fazendo o download periódico dos arquivos.
O que te passei aí foi só a "casca" da transferência FTP. Você pode melhorar e adaptar às suas necessidades.

Att,

erro_wininet.jpg
Reply all
Reply to author
Forward
0 new messages