From 02c8d345a9f93dea4ed79f0752f4170d79f0d8d1 Mon Sep 17 00:00:00 2001 From: Agnaldo Silva Date: Tue, 3 Feb 2026 16:52:33 -0300 Subject: [PATCH] =?UTF-8?q?fix:=20corrige=20erro=20de=20inser=C3=A7=C3=A3o?= =?UTF-8?q?=20de=20chave=20duplicada=20no=20cach=C3=AA=20do=20certificado?= =?UTF-8?q?=20digital?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- DFe.Utils/Assinatura/CertificadoDigital.cs | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/DFe.Utils/Assinatura/CertificadoDigital.cs b/DFe.Utils/Assinatura/CertificadoDigital.cs index 987bfbec0..8104d944d 100644 --- a/DFe.Utils/Assinatura/CertificadoDigital.cs +++ b/DFe.Utils/Assinatura/CertificadoDigital.cs @@ -32,7 +32,7 @@ /********************************************************************************/ using System; -using System.Collections.Generic; +using System.Collections.Concurrent; using System.IO; using System.Runtime.InteropServices; using System.Security.Cryptography; @@ -43,7 +43,7 @@ namespace DFe.Utils.Assinatura { public static class CertificadoDigital { - private static readonly Dictionary CacheCertificado = new Dictionary(); + private static readonly ConcurrentDictionary CacheCertificado = new ConcurrentDictionary(); #region Métodos privados @@ -204,8 +204,8 @@ private static X509Certificate2 ObterDadosCertificado(ConfiguracaoCertificado co /// /// Obtém um objeto contendo o certificado digital /// Se for informado , - /// o certificado digital será obtido pelo método , - /// senão será obtido pelo método + /// o certificado digital será obtido pelo método , + /// senão será obtido pelo método /// Para liberar os recursos do certificado, após seu uso, invoque o método /// public static X509Certificate2 ObterCertificado(ConfiguracaoCertificado configuracaoCertificado) @@ -213,20 +213,20 @@ public static X509Certificate2 ObterCertificado(ConfiguracaoCertificado configur if (!configuracaoCertificado.ManterDadosEmCache) return ObterDadosCertificado(configuracaoCertificado); - if (!string.IsNullOrEmpty(configuracaoCertificado.CacheId) && CacheCertificado.ContainsKey(configuracaoCertificado.CacheId)) - return CacheCertificado[configuracaoCertificado.CacheId]; + if (!string.IsNullOrWhiteSpace(configuracaoCertificado.CacheId) && CacheCertificado.TryGetValue(configuracaoCertificado.CacheId, out var certificadoEmCache)) + return certificadoEmCache; var certificado = ObterDadosCertificado(configuracaoCertificado); - var keyCertificado = string.IsNullOrEmpty(configuracaoCertificado.CacheId) + var keyCertificado = string.IsNullOrWhiteSpace(configuracaoCertificado.CacheId) ? certificado.SerialNumber : configuracaoCertificado.CacheId; configuracaoCertificado.CacheId = keyCertificado; + + var certificadoDoCache = CacheCertificado.GetOrAdd(keyCertificado, certificado); - CacheCertificado.Add(keyCertificado, certificado); - - return CacheCertificado[keyCertificado]; + return certificadoDoCache; } public static void ClearCache()