2013-10-29 67 views
4

我很新的WCF和試圖瞭解各種實例管理技術,我能夠了解每個呼叫&單身實例模式,但我很困惑在每個會話實例模式,在這種情況下,爲每個客戶都創建一個單獨的會話?但它不是發生在我的情況:WCF實例管理 - PerSession模式

我的WCF服務: -

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)] 
public class CounterService : ICounterService 
{ 
    int _counter = 0; 
    public int GetCount() 
    { 
     _counter++; 
     return _counter; 
    } 
} 

客戶端代碼: -

static void Main(string[] args) 
    { 
     CounterServiceReference.CounterServiceClient proxy = new  CounterServiceReference.CounterServiceClient(); 
     CounterServiceReference.CounterServiceClient proxy1 = new CounterServiceReference.CounterServiceClient(); 
     Console.WriteLine("WCF Instance mode: Per Session"); 
     Console.WriteLine("Invoking WCF service..."); 
     Console.WriteLine("Counter: {0}", proxy.GetCount()); 
     Console.WriteLine("Counter: {0}", proxy.GetCount()); 
     Console.WriteLine("Counter: {0}", proxy.GetCount()); 

     Console.WriteLine("---------------------------------------"); 
     Console.WriteLine("Counter: {0}", proxy1.GetCount()); 
     Console.WriteLine("Counter: {0}", proxy1.GetCount()); 
     Console.WriteLine("Counter: {0}", proxy1.GetCount()); 
     Console.ReadKey(); 
    } 

但是,控制檯顯示的結果爲1,1,1 --- 1,1,1但我認爲應該是1,2,3 --- 1,2,3 我在哪裏錯了?請幫忙! TIA

+0

你沒有顯示客戶電話 - 不可能知道那裏發生了什麼... –

+0

添加客戶端代碼 –

回答

4

我想也許解釋它是通過這些圖(從CodePlex article借來的話題)的最佳方式:

WCF Per Session WCF Per Call enter image description here

主要概念格羅克是,當一個給定的客戶端創建一個代理在PerSession模式的服務,從代理該服務重複調用將調用相同的服務實例(特定於客戶端) 。這允許你在服務對象中爲客戶端存儲一些狀態,因爲每個客戶端都有自己的服務對象實例。

這與PerCall和辛格爾頓如下:

當你創建一個代理到PerCall服務,你每次調用服務操作時得到服務對象的一個​​新的,新的實例。

當您創建SingleTon服務的代理時,該服務只有一個處理所有客戶端請求的實例。

2

會話意味着您可以使用來自asp.net的Session對象,而不是服務對象=它自己被重用。您可以將計數值保存在Session對象中,並且不會得到預期的結果。其結果將是1,2,3 --- 4,5,6