Skip to content

Commit 56afde8

Browse files
Merge pull request #1680 from AgnaldoSilva0/Branch_25415
fix: corrige erro de inserção de chave duplicada no cachê do certificado digital
2 parents f2e7d11 + 02c8d34 commit 56afde8

1 file changed

Lines changed: 10 additions & 10 deletions

File tree

DFe.Utils/Assinatura/CertificadoDigital.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
/********************************************************************************/
3333

3434
using System;
35-
using System.Collections.Generic;
35+
using System.Collections.Concurrent;
3636
using System.IO;
3737
using System.Runtime.InteropServices;
3838
using System.Security.Cryptography;
@@ -43,7 +43,7 @@ namespace DFe.Utils.Assinatura
4343
{
4444
public static class CertificadoDigital
4545
{
46-
private static readonly Dictionary<string, X509Certificate2> CacheCertificado = new Dictionary<string, X509Certificate2>();
46+
private static readonly ConcurrentDictionary<string, X509Certificate2> CacheCertificado = new ConcurrentDictionary<string, X509Certificate2>();
4747

4848
#region Métodos privados
4949

@@ -204,29 +204,29 @@ private static X509Certificate2 ObterDadosCertificado(ConfiguracaoCertificado co
204204
/// <summary>
205205
/// Obtém um objeto contendo o certificado digital
206206
/// <para>Se for informado <see cref="ConfiguracaoCertificado.Arquivo"/>,
207-
/// o certificado digital será obtido pelo método <see cref="ObterDeArquivo(string,string)"/>,
208-
/// senão será obtido pelo método <see cref="ListareObterDoRepositorio"/> </para>
207+
/// o certificado digital será obtido pelo método <see cref="ObterDeArquivo(string,string,X509KeyStorageFlags)"/>,
208+
/// senão será obtido pelo método <see cref="ObterDoRepositorio"/> </para>
209209
/// <para>Para liberar os recursos do certificado, após seu uso, invoque o método <see cref="X509Certificate2.Reset()"/></para>
210210
/// </summary>
211211
public static X509Certificate2 ObterCertificado(ConfiguracaoCertificado configuracaoCertificado)
212212
{
213213
if (!configuracaoCertificado.ManterDadosEmCache)
214214
return ObterDadosCertificado(configuracaoCertificado);
215215

216-
if (!string.IsNullOrEmpty(configuracaoCertificado.CacheId) && CacheCertificado.ContainsKey(configuracaoCertificado.CacheId))
217-
return CacheCertificado[configuracaoCertificado.CacheId];
216+
if (!string.IsNullOrWhiteSpace(configuracaoCertificado.CacheId) && CacheCertificado.TryGetValue(configuracaoCertificado.CacheId, out var certificadoEmCache))
217+
return certificadoEmCache;
218218

219219
var certificado = ObterDadosCertificado(configuracaoCertificado);
220220

221-
var keyCertificado = string.IsNullOrEmpty(configuracaoCertificado.CacheId)
221+
var keyCertificado = string.IsNullOrWhiteSpace(configuracaoCertificado.CacheId)
222222
? certificado.SerialNumber
223223
: configuracaoCertificado.CacheId;
224224

225225
configuracaoCertificado.CacheId = keyCertificado;
226+
227+
var certificadoDoCache = CacheCertificado.GetOrAdd(keyCertificado, certificado);
226228

227-
CacheCertificado.Add(keyCertificado, certificado);
228-
229-
return CacheCertificado[keyCertificado];
229+
return certificadoDoCache;
230230
}
231231

232232
public static void ClearCache()

0 commit comments

Comments
 (0)