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