У меня была эта проблема сегодня, и я думаю, что выяснил, что ее вызвало. Статический метод требует синхронизации.
Если вы наведите курсор на переменную localStore во время исключения и осмотрите свойство Certificates, вы, скорее всего, увидите что-то с эффектом «InvalidOperationException - для доступа к сертификатам необходимо использовать Open () или OpenRead (). .. бла-бла-бла ".
Происходит следующее: какой-то поток закрывает хранилище до того, как другой поток завершит к нему доступ.
Я решил проблему, сначала создав статический член класса для блокировки хранилища:
private static object m_storeLock = new object();
Когда вы заходите в магазин, вам нужно сделать что-то вроде следующего:
public static X509Certificate FindCertificate(string certName) {
X509CertificateStore store = null;
X509Certificate cert = null;
lock (m_storeLock) {
try {
store = X509CertificateStore.LocalMachineStore(X509CertificateStore.MyStore);
store.OpenRead();
X509CertificateCollection col =
(X509CertificateCollection)store.FindCertificateBySubjectString(certName);
if (col.Count > 0) {
cert = col[0];
}
}
catch {
}
finally {
if (store != null) {
store.Close();
}
}
}
if (cert == null) {
throw new ArgumentException("Certificate not found!");
}
return cert;
}
Для большей безопасности вы, вероятно, должны заблокировать локальную переменную "cert", но это не рабочий код, ребята ...: D ~