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()