ConcurrencyMode.Multiple和WebOperationContext.Current静态属性

时间:2011-06-30 08:04:11

标签: c# wcf concurrency state global

我有一个带ConcurrencyMode = ConcurrencyMode.Multiple选项的WCF服务。考虑到并发处理服务请求这一事实,我是否可以安全地读取传入请求HTTP标头并设置传出响应标头?我怀疑是因为WebOperationContext.Current是一个全球状态。它检查当前线程吗?

2 个答案:

答案 0 :(得分:2)

ConcurrencyMode.Multiple只有在您拥有允许共享服务实例的实例时才有意义。在REST服务的情况下,您很可能没有这样的实例化(除非您使用单例服务)并且您不应该有这样的实例化(因为REST服务不维护状态 - 所有状态都在请求中传输)。

REST服务使用每个请求实例化,每个请求由新线程(来自线程池)和服务类的新实例自动提供。您根本不需要此设置。

WebOperationContext.Current从上下文中的私有线程静态变量中检索当前上下文,因此它不会在线程之间共享。

答案 1 :(得分:0)

嗯,是和否。 WebOperationContext.Current属性确实是线程安全的。但是,返回的WebOperationContext对象的实例成员不是。这意味着您必须自己管理服务方法中的同步。

以下是MSDN对ConcurrencyMode.Multiple所说的内容:

  

服务实例是   多线程。没有同步   做出保证。因为其他   线程可以更改您的服务对象   在任何时候,你必须处理   同步和状态一致性   在任何时候。

您的服务实现可能如下所示:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class MyService : IMyService
{
    private Object syncObject = new Object();

    public void MyServiceOperation()
    {
        lock (this.syncObject)
        {
            // Service implementation
        }
    }
}