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。

每次呼叫服務範例啟用的過程可以描述如下圖。

Per Call Service

實現每個呼叫服務

[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
{...}

每個對談服務的過程可以被描述為下面的圖。

Per Session Service

下面的程式碼顯示了組態為私有對談的使用合約和服務。輸出表示該用戶端確實有一個專門的服務範例。

服務程式碼

[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 : ...
{...}

單例服務的過程可以被描述如下圖所示。

Singleton Service

單例程式碼範例的初始化和託管

服務程式碼

[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