Почему я получаю исключение ExecutionEngineException в OpenRead на X509CertificateStore? - PullRequest
1 голос
/ 24 марта 2009

Я использую класс WebServicesClientProtocol с токенами безопасности и использую следующий код для поиска токена безопасности:

private static X509SecurityToken GetSecurityCertificate(string subject)
{
    X509CertificateStore localStore = X509CertificateStore.LocalMachineStore(X509CertificateStore.MyStore);
    X509SecurityToken securityToken = null;
    if (localStore.OpenRead())
    {
       X509CertificateCollection certificateCollection = localStore.FindCertificateBySubjectString(subject);
        if (certificateCollection.Count == 0) throw new Exception("Skilríki finnst ekki í skilríkjageymslu");
        securityToken = new X509SecurityToken((X509Certificate)certificateCollection[0]);
    }
    localStore.Close();
    return securityToken;
}

Время от времени (но не всегда, и я не смог понять, когда именно) я получаю следующее исключение:

альтернативный текст http://www1.ruedenet.is/files/exception.png

1 Ответ

1 голос
/ 19 августа 2009

У меня была эта проблема сегодня, и я думаю, что выяснил, что ее вызвало. Статический метод требует синхронизации.

Если вы наведите курсор на переменную 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 ~

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...