WCF會話和ASP.Net會話狀態之間幾乎沒有共同之處 - 差異在MSDN中明確突出顯示。基本上,ASP.Net會話圍繞識別用戶與網站的交互,並允許存儲與該用戶會話相關聯的Session State
。
WCF會話在多個呼叫中保持狀態,例如,服務器將能夠恢復與來自同一會話所做的以前方法調用的狀態信息的對話。 WCF會話中的狀態沒有開箱即用的持久性,通常WCF會話的持續時間將比ASP.Net會話的持續時間短。
WCF會話期間調用的會話方法可能需要按特定順序(IsInitiating
,IsTerminating
)。
計算器的例子是一個很好的一個:
[ServiceContract(Namespace="http://Microsoft.ServiceModel.Samples", SessionMode=SessionMode.Required)]
public interface ICalculatorSession
{
[OperationContract(IsOneWay=true, IsInitiating=true, IsTerminating=false)]
void Clear();
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void AddTo(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void SubtractFrom(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void MultiplyBy(double n);
[OperationContract(IsOneWay = true, IsInitiating = false, IsTerminating = false)]
void DivideBy(double n);
[OperationContract(IsInitiating = false, IsTerminating = true)]
double Equals();
}
從上面的界面:
- 客戶端必須通過調用
Clear()
發起會話(即它不能啓動做任何Calcs(計算),直到此方法稱爲)
- 客戶端然後可以調用任何數量的
DivideBy
,MultiplyBy
,SubtractFrom
, AddTo
方法。在所有點上,服務器都會記住以前的狀態,即先前計算的結果,如計算器中的寄存器。
- 客戶呼叫
Equals
以獲得最終結果,這也會結束會話。
編輯 我已經上傳了一個樣本GitHub這裏,客戶機和服務器位,爲VS2010。
感謝您的回答。你可以給我一些小代碼,證明服務可以記住會話啓用之前的狀態結果。 – Thomas
當會話沒有實現時,IsInitiating = false,IsTerminating = true這些屬性有什麼意義? – Thomas
(編輯)AFAIK屬性IsInitiating和IsTerminating是沒有意義的,除非與SessionMode = SessionMode.Required/Allowed和基於會話的綁定一起使用。代碼示例 - 我會看看我能做什麼。 – StuartLC