2010-12-23 21 views
3

想清楚瞭解WCF的工作原理。 假設一個WCF服務已經暴露了一個函數A. 現在客戶創建了5個線程,並且每個線程都調用具有不同參數的函數A.WCF如何照顧到服務器的多個客戶端調用?

我認爲這應該發生 - 函數A的新實例會創建爲每個線程調用該函數。有人可以證實這一點。 我寫了一個沒有這樣做的POC,它給出了不一致的結果。

回答

1

默認值是爲每個呼叫創建一個新的wcf服務實例, here

+0

確切地說 - 「每個呼叫」模型 - 每個呼叫獲取一個新的服務類實例 - 是首選的和默認的實例化模型。偉大的MSDN Magazine文章來說明 – 2010-12-23 10:21:56

+1

默認實際上是PerSession。它早在2006年就是CTP版本中的PerCall,但在發佈之前進行了更改。但是,如果綁定不支持會話(例如BasicHttpBinding),它將按照每次調用行事。 – 2012-01-16 12:36:18

4

這通過ServiceBehavior屬性取決於您的服務配置的類實現您的服務合同:

[ServiceBehavior(
    InstanceContextMode = InstanceContextMode.PerSession, 
    ConcurrencyMode = ConcurrencyMode.Multiple)] 

使用參數InstanceContextMode你告訴WCF你怎麼想主辦您的服務:

  • :服務類的一個實例將被創建,接收的所有服務電話
  • PerSession:對於每一個連接客戶端的新實例將被創建
  • PerCall(默認):每次調用每個客戶端將創建一個新實例

接下來的事情是同步,當一個主機對象收到並行操作調用時。您可以使用ConcurrencyMode參數控制的行爲:

  • (默認):WCF串行化的所有操作,讓您的服務實例執行的只有一個或同時不操作調用。
  • Reentrant:WCF將所有操作調用直接委託給您的服務實例,但同步調用服務操作內的另一個WCF服務(很少使用,我認爲)。
  • 多個:WCF將所有操作調用直接委託給您的服務實例,而不同步。你必須擔心自己的同步。
相關問題