這一節大家了解下PerSession實例行為PerSession表示會話實例行為當客戶端調用服務器後服務器端會為客戶端分配一個新的服務實例這個實例在服務器端SESSION時間過期後將失效客戶端每調用一次服務在客戶端生成一個新的代理實例都會產生一個新的會話
PerSession實例行為有點類似於ASPNET中的session但又些不同
在WCF中使用PerSession實例需要手動設置行為
[ServiceBehavior(InstanceContextMode=InstanceContextModePerSession)] 默認情況下WCF的實例行為為PerSession
在WCF中並不是所有通信協議都可以使用PerSession實例行為的只有支持會話的通信協議才可以使用PerSession實例如NetTcpBinding NetNamePipeBinding
wsHttpBinding wsFederationHttpBindingwsDualHttpBinding
PerSession設置
我們看下代碼中怎樣設置 persession實例行為服務器端契約和行為設置
在契約實現上設置實例行為在契約上設置會話模式
[ServiceContract(SessionMode=SessionModeAllowed)]
public interface IPerSession
{
[OperationContract]
int AddCountBySession();
}
[ServiceBehavior(InstanceContextMode=InstanceContextModePerSession)]
public class PerSessionImpl:IPerSessionIDisposable
{
private int num;
/// <summary>
/// 通過 Session模式的方法調用
/// </summary>
/// <returns></returns>
public int AddCountBySession()
{
num = num + ;
ConsoleWriteLine(當前值:+numToString()+時間:+DateTimeNowToString());
return num;
}
public void Dispose()
{
ConsoleWriteLine(釋放實例);
}
}
客戶端調用
private void button_Click(object sender EventArgs e)
{
//PerSession調用方式
ChannelFactory<IPerSession> channelFactory = new ChannelFactory<IPerSession>(WSHttpBinding_IPerSession);
IPerSession client = channelFactoryCreateChannel();
//同一個客戶端實例調用AddCount方法兩次輸出的結果一樣
clientAddCountBySession();
clientAddCountBySession();
}
在上面的客戶端調用代碼我們同一個實例調用了兩次方法此時發現服務器端變量的值出現遞增這是因為這兩次調用在同一個會話內
我們多次點擊按鈕會發現每次點擊服務器端的變量值都是從開始遞增這是因為每次點擊按鈕都創建了一個新的代理實例相當於創建了一個新的會話
執行結果如下
我們可以這樣理解一個會話在客戶端每生成一個代理實例就算一個會話例如上面的 IPerSession client = channelFactoryCreateChannel();實例就是一個會話所以調用了AddCountBySession方法兩次出現變量值遞增的情況
客戶端調用
接下來我們在客戶端啟動的時候創建一個全局實例變量這樣連續單擊按鈕執行多次服務器端的變量值一直會遞增因為多次執行都是在一個會話內完成的
private void Form_Load(object sender EventArgs e)
{
ChannelFactory<IPerSession> channelFactory = new ChannelFactory<IPerSession>(WSHttpBinding_IPerSession);
Sessionclient = channelFactoryCreateChannel();
}
IPerSession Sessionclient;
private void button_Click(object sender EventArgs e)
{
//定義一個全局session實例進行調用
SessionclientAddCountBySession();
}
執行結果如下
以上代碼我們創建了一個全局實例多次點擊按鈕執行服務器端變量值在同一個會話期內一直遞增
Session時效設置
PerSession模式的會話時間是有限制的我們可以手動設置session的會話時間一旦超過了session的有效時間session會自動釋放
可以在服務器端的配置文件中的綁定設置中設置會話時間
receiveTimeout=:: 表示會話時間為秒一旦超時服務器就會關閉會話
配置文件如下
<bindings>
<wsHttpBinding>
<binding name=WSHttpBinding_IPerSession closeTimeout=::
openTimeout=:: receiveTimeout=:: sendTimeout=::
bypassProxyOnLocal=false transactionFlow=false hostNameComparisonMode=StrongWildcard
maxBufferPoolSize= maxReceivedMessageSize=
messageEncoding=Text textEncoding=utf useDefaultWebProxy=true
allowCookies=false>
<readerQuotas maxDepth= maxStringContentLength= maxArrayLength=
maxBytesPerRead= maxNameTableCharCount= />
<reliableSession ordered=true inactivityTimeout=::
enabled=false />
<security mode=Message>
<transport clientCredentialType=Windows proxyCredentialType=None
realm= />
<message clientCredentialType=Windows negotiateServiceCredential=true
algorithmSuite=Default />
</security>
</binding>
</wsHttpBinding>
</bindings>
通過以上的例子我們知道Persession的優缺點
通過persession可以設置會話的有效期保證服務實例在一定范圍內可以重復利用
缺點
使用session模式服務器不能被合理的利用客戶端調用完後實例不能立刻釋放增加了服務器的壓力
From:http://tw.wingwit.com/Article/program/net/201311/11660.html