WCF實例管理
這組由Windows通訊基礎(WCF)結合一組消息(客戶端請求)服務實例所采用的技術被稱為實例管理。一個完全由三種類型實例激活支持WCF,它們如下所述。
1.每個調用服務
每次調用服務是Windows通訊基礎的默認實例激活模式。當一個WCF服務配置為每個調用服務,一個CLR對象是時間跨度客戶調用或請求進行創建。 CLR代表公共語言運行庫,並在WCF服務實例。
在每個調用服務,每一個客戶端請求實現專用消耗相同的內存並且新的服務實例較少,相較於其他類型的實例激活。必需有InstanceContextMode屬性,以指示WCF服務以充當每次調用服務被設置為InstanceContextMode.PerCall。InstanceContextMode屬性屬於ServiceBehavior屬性。
因此,每調用服務可以被配置為
[ServiceContract] interface IMyContract {...} [ServiceBehavior (InstanceContextMode = InstanceContextMode.PerCall)] class MyService : IMyContract {...}
服務在這裡表示為IMyContract。
每次調用服務實例激活的過程可以描述如下圖。
實現每個調用服務
[DataContract] class Param {....} [ServiceContract] interface IMyContract { [OperationContract] void MyMethod(Param objectIdentifier); } class MyPerCallService : IMyContract, IDisposable { public void MyMethod(Param objectIdentifier) { GetState(objectIdentifier); DoWork(); SaveState(objectIdentifier); } void GetState(Param objectIdentifier) {....} void DoWork() {....} void SaveState(Param objectIdentifier) {....} public void Dispose() {....} }
這裡,參數是用於創建對上述實施例的模擬類型的參數。
2.每個調用服務
在此激活WCF模式,私有或者我們可以說這是一個保密的會話保持兩個實體,即客戶端和特定的服務實例。也被稱為私有會話服務,該模式提供了其始終致力於為每一個客戶要求和自主各有關該會話感知服務的其他情況下的一個新的服務實例。
InstanceContextMode屬性需要設置為PerSession發起這個每會話服務。在這裡,服務實例保留在內存中全部通過會話持續時間。從可擴展性的激活模式受到所配置的服務是不是能夠支持任何額外出色的客戶比其他幾個或可能達到一些,因為涉及的每一個專用服務實例的成本。
因此,每個會話服務可以被配置為
[ServiceBehavior (InstanceContextMode = InstanceContextMode.PerSession)] class MyService : IMyContract {...}
每個會話服務的過程可以被描述為下麵的圖。
下麵的代碼顯示了配置為私有會話的使用合約和服務。輸出表示該客戶端確實有一個專門的服務實例。
服務代碼
[ServiceContract(Session = true)] interface IMyContract { [OperationContract] void MyMethod(); } [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] class MyService : IMyContract, IDisposable { int m_Counter = 0; MyService() { Console.WriteLine("MyService.MyService()"); } public void MyMethod() { m_Counter++; Console.WriteLine("Counter = " + m_Counter); } public void Dispose() { Console.WriteLine("MyService.Dispose()"); } }
客戶端代碼
MyContractProxy proxy = new MyContractProxy(); proxy.MyMethod(); proxy.MyMethod(); proxy.Close();
輸出
MyService.MyService() Counter = 1 Counter = 2 MyService.Dispose()
3.單例服務
在此活化的WCF模式下,所有客戶端請求獨立於彼此,它們到服務端點的連接會連接到相同的單實例。隻有當主機關機那麼單例服務得不到處理。
這項服務是剛剛創建創建主機時。在這種情況下,主機不提供任何單一實例,該服務將返回為NULL。激活模式是最好的時候,每個方法調用的工作量少,無等待的操作後台有冇有在運行。
InstanceContextMode屬性需要設置為InstanceContextMode.Single啟動這一單例服務。
因此,一個單例服務可以被配置為
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] class MySingleton : ... {...}
單例服務的過程可以被描述如下圖所示。
單例代碼實例的初始化和托管
服務代碼
[ServiceContract] interface IMyContract { [OperationContract] void MyMethod( ); } [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)] class MySingleton : IMyContract { int m_Counter = 0; public int Counter { get { return m_Counter; } set { m_Counter = value; } } public void MyMethod( ) { m_Counter++; Trace.WriteLine("Counter = " + Counter); } }
主機代碼
MySingleton singleton = new MySingleton( ); singleton.Counter = 42; ServiceHost host = new ServiceHost(singleton); host.Open( ); //Do some blocking calls then host.Close( );
客戶端代碼
MyContractClient proxy = new MyContractClient( ); proxy.MyMethod( ); proxy.Close( );
輸出
Counter = 43