none
Compactar XML para envio MDF-e síncrono RRS feed

  • Pergunta

  • Prezados,

    Estou tentando enviar o xml do MDFe para a SEFAZ no modo síncrono.

    O modo síncrono pede que os dados sejam compactados antes de ser enviados.

    Peguei o código abaixo no site do Marcoratti

    Fiz as adaptações necessárias e aparentemente está funcionando.

    O problema é quando tento enviar para a SEFAZ retorna rejeição 244 - falha na descompactação da área de dados.

    Alguém sabe como posso resolver este problema?

    public static String Compactar(XmlDocument documento)
            {
                byte[] buffer = Encoding.UTF8.GetBytes(documento.OuterXml);
    
                MemoryStream ms = new MemoryStream();
    
                using (GZipStream zip = new GZipStream(ms, CompressionMode.Compress, true))
                {
                    zip.Write(buffer, 0, buffer.Length);
    
                }
    
                ms.Position = 0;
                MemoryStream outStream = new MemoryStream();
    
                byte[] compressed = new byte[ms.Length];
                ms.Read(compressed, 0, compressed.Length);
    
                byte[] gzBuffer = new byte[compressed.Length + 4];
                System.Buffer.BlockCopy(compressed, 0, gzBuffer, 4, compressed.Length);
                System.Buffer.BlockCopy(BitConverter.GetBytes(buffer.Length), 0, gzBuffer, 0, 4);
    
                return Convert.ToBase64String(gzBuffer);
            }

    Obrigado.

    quarta-feira, 27 de novembro de 2019 20:22

Respostas

  • Fabio I,

    Descobri o problema da rejeição 402.

    É necessário indicar no xml o encoding conforme abaixo. Eu só estava indicando a versão.

     < ? xml version="1.0" encoding="utf-8" ? >

    Abraço.

    Renato

    • Marcado como Resposta RQMello sexta-feira, 29 de novembro de 2019 14:00
    sexta-feira, 29 de novembro de 2019 13:59

Todas as Respostas

  • RQMello,

      O padrão precisa ser GZIP posteriormente convertida para Base64...
      ... você está usando esse padrão?

    ==========================================================
    EnviarMDFeSincrono(aXmlMDFe);

    OBS: Segundo o manual da SEFAZ, para realizar o envio síncrono de MDF-e, a mensagem deverá ser compactada no padrão GZIP e posteriormente convertida para Base64. Mas fique tranquilo, pois esta compactação é feita pelo componente.

    https://atendimento.tecnospeed.com.br/hc/pt-br/articles/360038657554-Enviar-MDF-e-em-modo-s%C3%ADncrono
    ==========================================================
    Como validar um arquivo XML de MDF-e no validador disponibilizado pela Sefaz RS

    https://www.oobj.com.br/bc/article/como-validar-um-arquivo-xml-de-mdf-e-no-validador-disponibilizado-pela-sefaz-rs-19.html
    ==========================================================
    MDF-e versão 3.00a - ACBrMDFe - Projeto ACBr

    https://www.projetoacbr.com.br/forum/topic/51782-mdf-e-vers%C3%A3o-300a/
    ==========================================================


    []'s,
    Fabio I.

    • Editado Fabio I quinta-feira, 28 de novembro de 2019 17:13
    quinta-feira, 28 de novembro de 2019 17:11
  • Fabio I.

    Peguei um outro exemplo aqui no fórum e aparentemente funcionou (veja fonte abaixo). Acredito que esteja no padrão GZIP pois estou usando a classe GZipStream e no fim converto para base64.

    Nesta nova versão o arquivo foi enviado porém retornou com a rejeição 402: XML da área de dados com codificação diferente de UTF-8.

    Estranho pois ao converter para o array de byte o XML converte para UTF8.

    public static String CompactarString(XmlDocument documento)
            {
            byte[] dad_b = Encoding.UTF8.GetBytes(documento.OuterXml);
    
            MemoryStream output = new MemoryStream();
            GZipStream gzip = new GZipStream(output, CompressionMode.Compress, true);
            gzip.Write(dad_b, 0, dad_b.Length);
            gzip.Close();
                
            String xlmCompactado = Convert.ToBase64String(output.ToArray());
           
            return xlmCompactado;
            }

    Obrigado,

    Renato

     
    sexta-feira, 29 de novembro de 2019 12:20
  • Fabio I,

    Descobri o problema da rejeição 402.

    É necessário indicar no xml o encoding conforme abaixo. Eu só estava indicando a versão.

     < ? xml version="1.0" encoding="utf-8" ? >

    Abraço.

    Renato

    • Marcado como Resposta RQMello sexta-feira, 29 de novembro de 2019 14:00
    sexta-feira, 29 de novembro de 2019 13:59