WCF服務對象實例化基礎

不少狀況下,咱們都須要控制wcf服務端對象的初始化方式,用來控制wcf實例在服務端的存活時間。框架

Wcf框架提供了三種建立wcf實例的方式。函數

WCF服務對象實例化基礎

在普通的WCF請求和相應過程當中,將產生下列活動:spa

  • WCF客戶端向WCF服務端對象發起一個請求。
  • WCF服務端對象實例化
  • WCF服務實例響應請求並給客戶端發送響應

在建立WCF服務端對象時有下列三種不一樣的方式線程

  • 爲每一個WCF客戶端請求建立一個新的WCF服務端實例
  • 爲每一個WCF客戶端會話只建立一個WCF實例
  • 全部的WCF客戶端都使用一個全局的WCF服務端實例

針對上述場景,WCF提供了三種便捷方式代理

  • 每次調用
  • 每一個會話
  • 單個實例

每次調用模式

當咱們將WCF服務設置爲每次調用模式時,在使用WCF代理客戶端每次方法調用時都將產生新的服務端實例對象

  • WCF客戶端第一次調用
  • 服務端爲客戶端的這個方法調用建立新的實例
  • WCF服務處理請求並向客戶端發送應答,銷燬服務實例,讓gc來清理
  • 當客戶端第二次調用了第二個方法時,建立了新的實例,處理請求,銷燬實例

如何實現WCF的每次調用實例化模式

要指定實例化模式,咱們須要在標籤ServiceBehavior中提供InstanceContextMode的值。這個標籤是放在Service類上的。以下列代碼所示:blog

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Percall)]內存

public class Service:IService資源

{rem

    private int intCounter;

    public int Increment()

    {

        intCounter++;

        return intCounter;

    }

}

假定在客戶端兩次調用該方法

ServiceReferrence1.ServiceClient obj=new ServiceReference1.ServiceClient();

MessageBox.Show(obj.Increment().ToString());

MessageBox.Show(obj.Increment().ToString());

此時,儘管咱們調用了兩次Increment方法,可是獲得的結果都是'1'。換句話說,WCF服務實例在每次方法調用時都被從新建立了,因此這個值始終爲1。

每次會話實例模式

不少時候,咱們都須要在多個方法調用時或者針對一個特定的會話來維護狀態。對於這樣的場景,咱們就須要將服務配置爲每一個會話模式。在每一個會話模式時,

在一次會話的交互過程當中將只建立一個WCF服務對象,過程以下:

  • 客戶端建立WCF服務代理,進行方法調用
  • 建立一個服務實例來處理方法響應
  • 客戶端在同一個會話中作一個或多個方法調用
  • 使用同一個服務實例來處理這些方法調用
  • 當客戶端結束了它的活動時,銷燬WCF實例,提供給gc來清理資源

如何實現會話實例模式

要將服務配置爲每一個會話模式,咱們須要配置標籤ServiceBehavior的InstanceContextMode對象的值設置爲PerSession

[ServiceBehavior(InstanceContextMode=InstanceContextMode.PerSession)]

public class Service:IService

{

    private int intCounter;

    public int Increment()

    {

        intCounter++;

        return intCounter;

    }

}

在客戶端,當使用以下代碼時,在客戶端最後的代碼執行時,將獲得'2'

ServiceReference1.ServiceClient obj=new ServiceReference1.ServiceClient();

MessageBox.Show(obj.Increment().ToString());

MessageBox.Show(obj.Increment().ToString());

 

 

 

單例模式

有時候咱們也會建立一個全局WCF實例爲全部的WCF客戶端提供服務。要建立一個單例模式WCF服務,可採起以下方式:

WCF客戶端向服務端發起一個請求

建立一個服務端實例來爲請求服務。這個實例不會被銷燬,而是持續爲其餘客戶端請求服務

假如這時候,某個其餘的客戶端如Client2,請求了同一個方法調用

將使用這個惟一的服務實例(由Client1建立的)來爲Client2提供服務。

 

如何實現單例模式

爲實現單例模式,將InstanceContextMode設置爲Single

[ServiceBehavior(InstanceContextMode=InstanceContextMode.Single)]

public class Service:IService

{

}

當你從不一樣的客戶端發起請求時,這個Counter計數一樣會增長。該Counter技術成爲了一個全局變量

 

使用每次調用,每一個會話,單例模式的選擇依據

每次調用

無狀態服務

  • 服務持有了大量資源時,如鏈接對象和大量的內存對象
  • 最主要的需求是可擴展,須要使用一個可擴展體系時
  • 在調用WCF函數時是在一個單線程模式時

每一個會話

  • 你須要在多個WCF調用之間維護狀態時
  • 擴大致系時?
  • 輕量級資源引用

單例

  • 想在你的WCF服務中共享全局數據
  • 不考慮擴展
相關文章
相關標籤/搜索