我有一個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專用字段。謝謝拉迪斯拉夫你的回答。 –