Usuário com melhor resposta
Compactar XML para envio MDF-e síncrono

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.
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
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
-
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
-
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