我有一个WCF服务ConcurrencyMode = ConcurrencyMode.Multiple
选项。考虑到服务请求是同时处理的事实,我可以安全地读取传入的请求HTTP标头并设置传出响应标头吗?我怀疑是因为WebOperationContext.Current
是一个全球性的国家。它检查当前线程吗?ConcurrencyMode.Multiple和WebOperationContext.Current静态属性
回答
ConcurrencyMode.Multiple
有意义只有当你有实例存储,其允许共享服务实例。在REST服务的情况下,你很可能没有这样的实例(除非你使用单例服务),你不应该有这样的实例化(因为REST服务不保持状态 - 所有状态都在请求中传输)。
REST服务使用每个请求实例,并且每个请求由一个新线程(来自线程池)和服务类的新实例自动提供。你根本不需要这个设置。
WebOperationContext.Current
从上下文中的专用线程静态变量中检索当前上下文,以便它不被线程共享。
好吧,无论是是和否。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
}
}
}
那么,有什么关于'WebOperationContext.Current'?它应该以某种方式了解当前的情况。由于它是静态的,它应该动态检索我猜测的当前线程的上下文。 –
@bsnote正确:静态[WebOperationContext.Current](http://msdn.microsoft.com/zh-cn/library/system.servicemodel.web.weboperationcontext.current.aspx)属性是线程安全的。但是[WebOperationContext](http://msdn.microsoft.com/en-us/library/system.servicemodel.web.weboperationcontext.aspx)类的实例成员不是,所以所有尝试操作对象上的任何属性来自多个线程可能会受到竞争条件的影响。您最好将整个服务方法实现同步到安全的一面。 –
- 1. ServletContext属性和静态属性
- 2. 继承和静态属性
- 3. 静态属性和实例
- 4. @PersistenceContext和静态属性
- 5. Zend和静态类属性
- 6. 通过静态和非静态方法访问静态属性?
- 7. C++静态属性
- 8. 静态变量与静态属性
- 9. 具有静态属性的静态类
- 10. 静态类中的静态属性
- 11. CSS偏移属性和静态位置
- 12. 基类和继承的静态属性
- 13. 绑定到静态类属性和StringFormat
- 14. PHP的静态属性和方法
- 15. PHP重载的静态属性和静态方法
- 16. 如何在Javascript中继承静态和非静态属性?
- 17. 静态属性要求
- 18. AngularJS中的“静态”属性
- 19. 访问静态属性PARAMS
- 20. 注入静态属性值
- 21. 绑定到静态属性
- 22. 静态属性初始化
- 23. Java MQEnvironment静态属性
- 24. 静态属性/ ViewModel(C#,WinRT)
- 25. 静态Rails3中content_tag属性
- 26. PHP中的静态属性
- 27. 组非静态类属性
- 28. Java中的静态属性
- 29. 静态属性抽象类
- 30. PHP的静态属性
是的,我可以在OperationContext类中看到用ThreadStatic属性标记的currentContext专用字段。谢谢拉迪斯拉夫你的回答。 –