我有一个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 操作?
我会考虑使用OperationContext在操作调用期间使数据"静态"。
下面是类似的讨论 在哪里存储当前 WCF 调用的数据?ThreadStatic 安全吗?