2009-03-24 5 views
1

나 보안 토큰과 WebServicesClientProtocol 클래스를 사용하고 사용할 보안 토큰을 찾으려면 다음 코드를 사용하고 있습니다 :X509CertificateStore에서 OpenRead에서 ExecutionEngineException을 얻을 수있는 이유는 무엇입니까?

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; 
} 

땐 (항상은 아니지만 내가 알아낼 수 없었다 정확하게) 나는 다음과 같은 예외 얻을 때 :

alt text http://www1.ruedenet.is/files/exception.png

+0

실제로 동일한 문제가 있습니다. 이것에 대한 해결책을 찾았습니까? 대답을 게시 할 수 있다면 우수 할 것입니다. –

+0

죄송합니다 - 여전히 해결책이 없습니다. 예, 해결책을 찾으면 해결책을 게시 할 것입니다. 동일하게하십시오. 고맙습니다. –

답변

1

을 오늘이 문제를했고 나는 내가 그것을 일으키는 원인이 된 내용을 알아 냈어요 생각합니다. 정적 메소드에는 동기화가 필요합니다.

예외가 발생했을 때 localStore 변수를 가리키고 Certificates 속성을 검사하면 "InvalidOperationException - 인증서에 액세스하려면 Open() 또는 OpenRead()를 사용해야합니다. ... ㅋ ㅋ ㅋ ㅋ ㅋ ㅋ".

다른 스레드가 액세스를 마치기 전에 일부 스레드가 저장소를 닫고 있습니다.

내가 먼저 가게를 잠금에 대한 정적 클래스 멤버를 작성하여 문제를 해결 :

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; 
} 

: 당신이 저장소에 액세스 할 때

private static object m_storeLock = new object(); 

다음과 같은 것을해야 할 것이다 추가 안전을 위해서 지역 변수 "cert"를 잠궈 야하지만 이것은 프로덕션 코드 사용자가 아닙니다 ... : D ~

관련 문제