2011-06-30 76 views

回答

2

ConcurrencyMode.Multiple有意義只有當你有實例存儲,其允許共享服務實例。在REST服務的情況下,你很可能沒有這樣的實例(除非你使用單例服務),你不應該有這樣的實例化(因爲REST服務不保持狀態 - 所有狀態都在請求中傳輸)。

REST服務使用每個請求實例,並且每個請求由一個新線程(來自線程池)和服務類的新實例自動提供。你根本不需要這個設置。

WebOperationContext.Current從上下文中的專用線程靜態變量中檢索當前上下文,以便它不被線程共享。

+0

是的,我可以在OperationContext類中看到用ThreadStatic屬性標記的currentContext專用字段。謝謝拉迪斯拉夫你的回答。 –

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 
     } 
    } 
} 
+0

那麼,有什麼關於'WebOperationContext.Current'?它應該以某種方式瞭解當前的情況。由於它是靜態的,它應該動態檢索我猜測的當前線程的上下文。 –

+0

@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)類的實例成員不是,所以所有嘗試操作對象上的任何屬性來自多個線程可能會受到競爭條件的影響。您最好將整個服務方法實現同步到安全的一面。 –