ARQUIVO SNGPC VIA WS Cannot find central directo

 Tópico anterior Próximo tópico Novo tópico

ARQUIVO SNGPC VIA WS Cannot find central directo

VB.NET

 Compartilhe  Compartilhe  Compartilhe
#489461 - 11/07/2019 12:22:16

OVINICIUSGUI
ARARAQUARA
Cadast. em:Julho/2019


Última edição em 11/07/2019 12:24:45 por OVINICIUSGUI

Estou com dificuldade para enviar um arquivo para validação da anvisa via WS.

utilizo a variável "Id_Senha" para recuperar os dados de e-mail e senha cadastrados anteriormente pelo cliente.

preencho o objeto "body" do tipo "wsSNGPC.EnviaArquivoSNGPCRequestBody"

    arq = utilizo a função ZIP para comprimir e converter para base64 o xml

    Email = pego do cadastro do realizado pelo cliente

    Senha = pego também do cadastro

    HashIdentificacao = utilizo a função GerarMD5  para gerar o hash

atribuo o objeto "boby" ao objeto "enviar" do tipo "wsSNGPC.EnviaArquivoSNGPCRequest" na propriedade "Body"

por fim chamo o método EnviarArquivoSNGPC do objeto "metodos" do tipo "wsSNGPC.sngpcSoapClient"
todos os metodos e objetos utilizados para cominicação webservice foram gerados na classe Reference.vb gerada automaticamente ao conectar a ide(Visual Studio 2017) ao webservices, a classe que gera o xml foi criada a partir dos arquivos xsd disponibilizados no site da anvisa.


ao tentar enviar o arquivo obtemos o retorno: "Ocorreu um erro ao tentar descompactar o arquivo. (Cannot find central directory)"
alguem poderia me dizer o que pode ser:
seguem os codigos:




Public Shared Sub EnviarXML(xml As String, empresa As Long)
        Dim body As New wsSNGPC.EnviaArquivoSNGPCRequestBody
        Dim enviar As New wsSNGPC.EnviaArquivoSNGPCRequest
        Dim metodos As New wsSNGPC.sngpcSoapClient
        Dim retorno As New wsSNGPC.EnviaArquivoSNGPCResponse
        Dim Id_Senha As New Configuracao_Envio_Anvisa
        Dim bll As New Configuracao_Envio_AnvisaBLL
        Dim MD5 As String = ""
        Dim xml2 As String = ""

        Dim rt As String

        Try

            Id_Senha = bll.getEmailSenhaByEmpresa(empresa)

            body.Arq = Zip(xml)
            body.Email = Id_Senha.Email.ToLower()
            body.Senha = Id_Senha.Senha
            Funcoes.GerarMD5("", xml, MD5)
            body.HashIdentificacao = MD5
            enviar.Body = body
            rt = metodos.EnviaArquivoSNGPC(body.Email, body.Senha, body.Arq, body.HashIdentificacao)

        Catch ex As Exception
            Throw
        End Try


    End Sub



Public Shared Function Zip(text As String) As String
        Dim buffer As Byte() = System.Text.Encoding.Unicode.GetBytes(text)
        Dim ms As New MemoryStream()
        Using zipStream As New System.IO.Compression.GZipStream(ms, System.IO.Compression.CompressionMode.Compress, True)
            zipStream.Write(buffer, 0, buffer.Length)
        End Using

        ms.Position = 0
        Dim outStream As New MemoryStream()

        Dim compressed As Byte() = New Byte(ms.Length - 1) {}
        ms.Read(compressed, 0, compressed.Length)

        Dim gzBuffer As Byte() = New Byte(compressed.Length + 3) {}
        System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length)
        System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4)
        Return Convert.ToBase64String(gzBuffer)
        'Return gzBuffer
    End Function



Public Function EnviaArquivoSNGPC(ByVal Email As String, ByVal Senha As String, ByVal Arq As String, ByVal HashIdentificacao As String) As String
            Dim inValue As wsSNGPC.EnviaArquivoSNGPCRequest = New wsSNGPC.EnviaArquivoSNGPCRequest()
            inValue.Body = New wsSNGPC.EnviaArquivoSNGPCRequestBody()
            inValue.Body.Email = Email
            inValue.Body.Senha = Senha
            inValue.Body.Arq = Arq
            inValue.Body.HashIdentificacao = HashIdentificacao
            Dim retVal As wsSNGPC.EnviaArquivoSNGPCResponse = CType(Me, wsSNGPC.sngpcSoap).EnviaArquivoSNGPC(inValue)
            Return retVal.Body.EnviaArquivoSNGPCResult
        End Function




Resposta escolhida #489464 - 11/07/2019 13:17:53

PLUGSOFTSM
SANTA MARIA
Cadast. em:Julho/2015


Eu só uso essa função pra fazer o envio... e sempre funcionou corretamente

    Friend Function EnviarFileAnvisa(ByVal NomeArq As String) As String
        Dim Ret As String = ""
        Try
            If Senha = "" Then Throw New Exception("Falta informar a senha do responsável pela emissão do arquivo....")
            If Email = "" Then Throw New Exception("Falta informar o Email cadastrado junto a anvisa para a emissão do lote....")
            Dim Envio As SNGPCProd.sngpc = New SNGPCProd.sngpc
            Envio.Url = "http://sngpc.anvisa.gov.br/webservice/sngpc.asmx"
            Ret = Envio.EnviaArquivoSNGPC(Email.ToLower, Senha, LerBytesFile(NomeArq), GerarHash(NomeArq))
            Envio.Dispose()
            Envio = Nothing
        Catch ex As Exception

            Ret = ex.Message

        End Try
        Return Ret
    End Function

    Friend Function LerBytesFile(ByVal NomeArq As String) As Byte()
        Dim F As New FileInfo(NomeArq)
        Dim Bytes As Long = F.Length
        Dim Fs As New FileStream(NomeArq, FileMode.Open, FileAccess.Read)
        Dim Br As New BinaryReader(Fs)
        Dim Dados As Byte() = Br.ReadBytes(CInt(Bytes))
        Br.Close()
        Fs.Close()
        Return Dados
    End Function

    Friend Function GerarHash(ByVal ArquivoXML As String) As String
        Dim Hash As String = ""
        Dim TxtConverter As ASCIIEncoding = New ASCIIEncoding
        Dim MdProvider As MD5CryptoServiceProvider = New MD5CryptoServiceProvider
        Dim ArqByte As Byte()
        ArquivoXML = ArquivoXML.Replace("\r", "").Replace("\n", "").Replace("\t", "")
        ArqByte = TxtConverter.GetBytes(ArquivoXML)
        ArqByte = MdProvider.ComputeHash(ArqByte)
        Hash = BitConverter.ToString(ArqByte).Replace("-", String.Empty)
        ' Hash = tohexstring
        Return Hash
    End Function


Pra compactar eu faço assim
            Dim ArqZip As String = Path.Combine(Path.GetDirectoryName(NomeArq), Path.GetFileName(NomeArq).Replace("XML", "ZIP"))
            If File.Exists(ArqZip) Then File.Delete(ArqZip)
            Dim Zip As ZipFile = New ZipFile
            Zip.AddFile(NomeArq, String.Empty)
            Zip.Save(ArqZip)
            Zip.Dispose()
            Zip = Nothing
            File.Delete(NomeArq)
            If Not File.Exists(ArqZip) Then Throw New Exception("Não foi possível criar o arquivo:" & Chr(13) & ArqZip)
            St = EnviarFileAnvisa(ArqZip)



#489467 - 11/07/2019 17:20:17

OVINICIUSGUI
ARARAQUARA
Cadast. em:Julho/2019


A classe  SNGPCProd.sngpc como vc a gerou ? Pois quando eu conectei ao web service ele não criou uma classe sngpc, na verdade ele gerou varias partial class e a que possui o metodo de envio do arquivo é a classe sngpcSoapClient mas a mesma não possui o atributo URL, tem alguma outra forma para que eu possa gerar essa classe sngpc ?




#489469 - 11/07/2019 17:58:44

PLUGSOFTSM
SANTA MARIA
Cadast. em:Julho/2015


 Anexos estao visíveis somente para usuários registrados

Postei um passo a passo de como chegar na montagem da classe
Só seguir a numeração do arquivo

Cuidaddo que aqui na empresa já teve computadores que não gerava o webservice
Dava erro: Fui pesquisar e percebi que isso pode ser por antivirus, windows desatualizado ou ainda algum software de banco
Se acontecer isso contigo, tenta criar em outro pc e depois do webservice criado, retorna ao teu pc que vai funcionar



#489470 - 11/07/2019 18:02:35

OVINICIUSGUI
ARARAQUARA
Cadast. em:Julho/2019


 Anexos estao visíveis somente para usuários registrados

foi dessa forma que fiz, porem a classe que ele gera de referencia não tem esse método que você utilizou. segue a classe





#489471 - 11/07/2019 18:59:36

PLUGSOFTSM
SANTA MARIA
Cadast. em:Julho/2015


Tu viu que o arquivo que tu me passaste é um partial
Ou seja a classe sngpc deve estar em outro partial

Mas por que tu te preocupa com isso

Segue o passo a passo que eu te passei, cria a referência ao webservice no teu projeto e usa ela
Note que SNGPCProd.sngpc  a expressão SNGPCProd é o nome que eu dei ao webservice referenciado no meu projeto
É só se preocupar com os parâmetros dele

eu nunca nem olhei esse código que vc me mandou



#489504 - 16/07/2019 13:27:52

LEANTRONIC
SAMPA
Cadast. em:Março/2012


Última edição em 16/07/2019 13:28:58 por LEANTRONIC

Pessoal boa tarde,

Aproveitando que vocês trabalham com o SNGPC no dia a dia eu precisaria tirar uma duvida bem simples com vocês.

A um tempo atras comecei a fazer a integração porem não dei andamento, lembro que na epoca eu entrei em contato com a anvisa e fiz um credenciamento para obter login de homologação... consegui na epoca fazer os procedimentos porem depois chegou uma informação que era obrigatorio um credenciamento em cada COVISA de cada municipio para ter a permissão de distribuir o software com o recurso do SNGPC... isso procede até hj ou eu entendi errado na epoca? Obrigado




 Tópico anterior Próximo tópico Novo tópico


Tópico encerrado, respostas não sao permitidas
Encerrado por OVINICIUSGUI em 02/08/2019 17:49:01