7

我收到 ObjectDisposedException:安全句柄已关闭。

这是我的代码:

我正在尝试创建一个接口和实现类,它将使我能够获取一个字符串,将一个已知密钥附加到它,为该字符串和密钥计算 MD5 哈希,并返回计算出的哈希:

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

谢谢

4

2 回答 2

11

您的代码不是线程安全的。_hashAlgo线程之间不能共享。请注意,您看到的异常并不是唯一可能导致的问题;我相信这个问题也可能导致不正确的哈希值。您需要HashAlgorithm每次都创建一个新对象,或者查看线程局部变量以为每个线程创建一个实例。

于 2014-01-16T01:07:15.673 回答
2

该代码似乎工作正常。问题可能是:

  1. 对象在构造和使用之间是否被序列化和反序列化?如果是这样,将其MDS.Create()移至内部GetSignature()
  2. 对象是否被处置(SignService或者_hashAlgo)?如果是这样,请不要在需要时处理或重新创建它。
于 2012-09-07T01:20:24.517 回答