2012-08-31 17 views
5

Otrzymuję ObjectDisposedException: Safe handle został zamknięty.ObjectDisposedException Podczas używania MD5 ComputeHash

To jest mój kod:

Próbuję utworzyć interfejs i wdrażania klasy, która pozwoli mi uzyskać ciąg, należy dołączyć do niego znanego klucza, obliczenia skrótu MD5 dla tego łańcucha i klucz, a zwrotu obliczoną hash:

public interface ISignService 
{ 
    string GetSignature(string str); 
} 

public class SignService : ISignService 
{ 
    private readonly ISignSettings _signSettings; 
    private readonly HashAlgorithm _hashAlgo; 


    public SignService(ISignSettings signSettings) 
    { 
     _signSettings = signSettings; 
     _hashAlgo = MD5.Create(); 
    } 

    public string GetSignature(string str) 
    { 
     var strWithKey = str + _signSettings.EncryptionKey; 

     var hashed = _hashAlgo.ComputeHash(Encoding.UTF8.GetBytes(strWithKey)); 

     return hashed.ToHexString(); 
    } 
} 

Dzięki

+2

Która linia kodu zgłasza wyjątek? – ken2k

+0

Czy 'hashed.ToHexString()' jest metodą rozszerzenia? Wkleiłem twój kod, a metoda nie istnieje ... – Laoujin

+0

Witam, jest to metoda rozszerzenia. linia, która wyrzuca, to: var hashed = _hashAlgo.ComputeHash (Encoding.UTF8.GetBytes (strWithKey)); – user1625867

Odpowiedz

1

Kod wydaje się działać poprawnie. Problem może być następujący:

  1. Czy obiekt jest serializowany i deserializowany między konstrukcją i używać? Jeśli tak, przenieś MDS.Create() do wnętrza obiektu, który jest usuwany (albo SignService lub _hashAlgo)? Jeśli tak, nie wyrzucaj go ani nie odtwarzaj w razie potrzeby.
5

Twój kod nie jest wątek bezpieczny. _hashAlgo nie można udostępniać między wątkami. Zauważ, że wyjątek, który widzisz, nie jest jedynym możliwym problemem; Wierzę, że ten problem może również prowadzić do nieprawidłowych wartości mieszania. Musisz za każdym razem utworzyć nowy obiekt HashAlgorithm lub sprawdzić lokalnych wątków, aby utworzyć jedną instancję na wątek.

+0

Jest to najprawdopodobniej poprawna odpowiedź. Zobacz odpowiedź na pytanie [Finalizer issue under stress?] (Http://stackoverflow.com/a/26592826/1945631). Równoczesny dostęp do metod instancji tej samej instancji podklasy 'HashAlgorithm' spowoduje ten wyjątek. –

+1

'ten problem również może prowadzić do nieprawidłowych wartości skrótu" - to prawda. Wcześniej miałem do czynienia z tym samym problemem. – Denis

Powiązane problemy