1

我有一个 WCF 服务,并且我有以下(简化的)类:

public class PerOperationSingleton : IDisposable
{
    private static bool _hasInstance = false;

    public PerOperationSingleton()
    {
        if(_hasInstance)
            throw new InvalidOperationException("Cannot have multiple instances during a single WCF operation");

        _hasInstance = true;
    }

    public void Dispose()
    {
        _hasInstance = false;
    }
}

我想,这是一段非常不言自明的代码。我不需要整个 WCF 服务的单例,而只需要在单个操作调用期间。如果释放了 PerOperationSingleton 的一个实例,则在同一 WCF 操作期间创建一个新实例应该是安全的。

问题是我不知道如何使 _hasInstance 变量仅对一个 WCF 操作有效。我知道 [ThreadStatic],但我听说 ASP.NET 和 WCF 不保证操作将在单个线程上执行 - 它可能会转移到另一个线程。

我绝对不希望我的 _hasInstance = true 移动到线程池并在其他操作从池中选择该线程时被错误地检测到。

如果 WCF 操作移动到另一个线程,我希望 _hasInstance 变量在设置时保持“true”值。

而且我不想更改我的 WCF 服务的一些全局设置以避免影响性能或遇到一些以后难以调试和解决的问题(我对高级 ASP.NET 和 WCF 主题感觉不够精通)。

我也无法将 _hasInstance 存储在会话中,因为我的客户出于各种原因请求禁用 .NET 会话。

我希望 PerOperationSingleton 类实际上与环境无关。它不应该真正了解 WCF 或 ASP.NET。

如何在整个 WCF 操作调用期间使 _hasInstance 变量为静态且不影响其他 WCF 操作?

4

1 回答 1

2

我会考虑在操作调用期间使用 OperationContext 使您的数据“静态”。

这是一个类似的讨论,在哪里存储当前 WCF 调用的数据?ThreadStatic 安全吗?

于 2013-01-26T12:51:18.930 回答