不少狀況下,咱們都須要控制wcf服務端對象的初始化方式,用來控制wcf實例在服務端的存活時間。框架
Wcf框架提供了三種建立wcf實例的方式。函數
在普通的WCF請求和相應過程當中,將產生下列活動:spa
在建立WCF服務端對象時有下列三種不一樣的方式線程
針對上述場景,WCF提供了三種便捷方式代理
當咱們將WCF服務設置爲每次調用模式時,在使用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服務對象,過程以下:
如何實現會話實例模式
要將服務配置爲每一個會話模式,咱們須要配置標籤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技術成爲了一個全局變量
無狀態服務