beatriz-n Postado 2 Julho Postado 2 Julho Olá, pessoal. Estou enfrentando um comportamento que aparenta ser um problema na ACBrLibNFSe MT relacionado à troca de certificados digitais em tempo de execução. Cenário Minha aplicação possui um BackgroundService responsável por sincronizar as NFS-e Tomadas de diversas empresas. Cada empresa possui seu próprio certificado digital. Durante a execução, o serviço percorre todas as empresas e, para cada uma delas: Obtém o certificado correspondente; Configura a ACBrLib com esse certificado; Realiza a consulta das NFS-e Tomadas utilizando o CNPJ da empresa. Como o processamento ocorre sequencialmente para várias empresas, a biblioteca precisa trocar de certificado entre uma consulta e outra. Problema observado A aplicação consegue recuperar corretamente o certificado de cada empresa. Inclusive, antes da consulta, consigo validar que o certificado carregado é o esperado utilizando o método ObterCertificado(). Entretanto, durante a consulta, a ACBrLib continua utilizando o certificado da empresa processada anteriormente. Como consequência: a consulta é enviada utilizando um certificado diferente do CNPJ informado; os XMLs de retorno e os erros indicam que a autenticação foi realizada com o certificado anterior; o comportamento ocorre justamente quando há troca de empresa durante a sincronização. Pela análise realizada, o problema não parece estar na recuperação do certificado pela aplicação, mas sim no momento em que a ACBrLib MT deveria substituir o certificado utilizado internamente. Comportamento observado durante o debug Durante os testes encontrei um comportamento que reforçou essa suspeita. Coloquei um breakpoint no método ObterCertificado(). Após confirmar que o certificado retornado era o esperado, permaneci aproximadamente um minuto analisando o retorno da biblioteca e o log em nível paranoico antes de continuar a execução. Ao prosseguir para o método de consulta, a ACBrLibNFe passou a utilizar o certificado correto da empresa processada naquele loop, sem qualquer alteração de thread, handle, recriação da instância da biblioteca ou utilização dos métodos Inicializar() e Finalizar(). Ou seja, apenas o fato de a execução permanecer pausada por cerca de um minuto fez com que a consulta fosse assinada com o certificado correto. Quando a aplicação executa normalmente, sem essa pausa, a consulta é assinada utilizando o certificado da empresa anterior. Esse comportamento me leva a suspeitar de algum problema de sincronização, atualização interna ou troca efetiva do certificado dentro da ACBrLibNFe MT, já que a única variável alterada foi o tempo entre a configuração do certificado e a execução da consulta. Gostaria de saber se esse comportamento é conhecido, se existe alguma etapa adicional necessária para garantir a troca efetiva do certificado ou se realmente pode se tratar de um problema na implementação da ACBrLibNFe MT. Gostaria que não descartassem a possibilidade de um problema na Lib. Conversei com meu superior que implementou a mesma funcionalidade mas com ACBrLibNFe MT e ele constatou que não precisou fazer nenhuma reconstrução da instancia ACBrLib ou utilização de métodos de Inicializar() e Finalizar(). Caso seja necessário, posso fornecer logs em nível paranoico e um exemplo reproduzindo o problema. Estou utilizando a configuração em memoria [Memory]
beatriz-n Postado Segunda as 16:45 Autor Postado Segunda as 16:45 com wincrypt esta funcionando normalmente, com wincrypt não existe esse comportamento extranho. Sabendo disso troquei minha dll openssl para a versao 3 mas o comportamento ainda persiste, gostaria de utilizar openssl por conta da padronizacao dos bases do meu projeto, caso alguem tenha alguma sugestao de como resolver esse problema ficarei agradecida em saber
beatriz-n Postado Terça as 20:05 Autor Postado Terça as 20:05 boa tarde, não há nada de errado com a ACBrLib, pessoal que esta usando ACBrLibNFSe com C# que vai fazer esse tipo de sincronização, resolvi adicionando um escopo para cada empresa exemplo: private readonly IServiceScopeFactory _scopeFactory; foreach (var config in empresas) { try { using var scopeEmpresa = _scopeFactory.CreateScope(); var sync = scopeEmpresa.ServiceProvider.GetRequiredService<INfseAppService>(); await sync.SincronizarEmpresa(config.EmpresaId!.Value, config.ContaId!.Value); } catch (Exception ex) { _logger.LogError(ex, "Erro ao sincronizar empresa {EmpresaId}", config.EmpresaId); } } meu metodo de consulta não fiz nada demais DfeLib.LimparLista(); await ConfigurarComponente(config.EmpresaId!.Value, config.ContaId!.Value); DfeLib.Config.CodigoMunicipio = DfeConfig!.Cidade!.CodigoIbgeCidade; DfeLib.Config.Emitente.CNPJ = Certificado!.CnpjCpf!; var respostaConsulta = DfeLib.ConsultarDFe(nsuAtual);
Recommended Posts
Crie uma conta ou entre para comentar
Você precisar ser um membro para fazer um comentário
Criar uma conta
Crie uma nova conta em nossa comunidade. É fácil!
Crie uma nova contaEntrar
Já tem uma conta? Faça o login.
Entrar Agora