ConcurrencyMode.Multiple和WebOperationContext.Current静态属性

本文关键字:静态 属性 Current WebOperationContext Multiple ConcurrencyMode | 更新日期: 2023-09-27 18:00:40

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

ConcurrencyMode.Multiple和WebOperationContext.Current静态属性

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

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

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

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

以下是MSDN对并发模式的介绍

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

然后,您的服务实现可能看起来像这样:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]
public class MyService : IMyService
{
    private Object syncObject = new Object();
    public void MyServiceOperation()
    {
        lock (this.syncObject)
        {
            // Service implementation
        }
    }
}