WCF會話服務基本應用技巧分享
WCF開發工具是一款由微軟公司開發的建立于.Net Framework 2.0基礎上的一個.Net Framework 3.0的重要組成部分。在這里我們可以通過對WCF會話服務做一個詳細了解,以方便大家對此的掌握。
會話服務(Sessionful Service):為每次客戶端連接分配一個服務實例。類似于Net Remoting的客戶端激活模式。為每個客戶端創建一個專門的服務實例。只要會話沒有結束,該實例就不會被銷毀。 對于會話服務而言,是一個客戶端代理對應一個服務實例。也就是說,WCF會話服務中的服務是與代理相對應的,而不是對應于一個客戶端。
配置私有會話
服務實例的默認激活方式為WCF會話服務模式。我們也可以顯示配置會話服務的方式,使用[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)],具體代碼如下所示:
- [ServiceBehavior(InstanceContextModeInstanceContextMode =
InstanceContextMode.PerSession)]- public class WCFServicePerSession : IWCFService
- {
- }
服用要支持會話要依靠傳輸層的持久連接,例如NetTcpBinding會保持一個連接,而與連接無關的HTTP協議是因為無法保持連接,所以BasicHttpBinding是不支持會話的
如果服務要跨越服務邊界,那么就要在服務契約這一層使用ServiceContact的SessionMode屬性,SessionMode為枚舉類型:
- public enum SessionMode
- {
- Allowed,
- Required,
- NotAllowed
- }
SessionMode.Allowed
SessionMode.Allowed是SessionMode的默認屬性,一個服務端方法被標記了SessionMode.Allowed屬性,表示它是允許傳輸會話的,但并不強制要求綁定必須支持會話,而服務的行為是采用單調還是會話這要取決于服務的配置和使用的綁定#t#
SessionMode.Required
SessionMode.Required 要求必須使用傳輸層會話,也就是說服務終結點的綁定一定得支持傳輸層會話,若要設計一個會話契約,我們還是使用SessionMode.Required而非SessionMode.Allowed
SessionMode.NotAllowed
SessionMode.NotAllowed指定契約永不使用傳輸會話,也不使用應用層會話,不管服務配置如何,總是采用單調服務方式。我們將一個契約標記SessionMode.NotAllowed以后,就不能使用NetTcpBinding等支持傳輸層會話的綁定,而如果像WSHttpBinding這樣模擬傳輸層會話則是允許的,考慮到代碼的可讀性建議在使用SessionMode.NotAllowed時總是把服務配置為單調服務
一致性配置
為了方便,如果一個契約是會話契約那么***把所有契約都配置為會話契約,要避免將單調服務于會話契約混合定義在相同的WCF會話服務類型中
編寫如下服務端代碼
- [ServiceContract(SessionModeSessionMode = SessionMode.Required)]
- interface IMyContract
- {
- [OperationContract]
- void MyMethod();
- }
- [ServiceBehavior(InstanceContextModeInstanceContextMode=
InstanceContextMode.PerSession)]- class MyService : IMyContract,IDisposable
- {
- int m_Counter = 0;
- public MyService()
- {
- MessageBox.Show("Counter = " + m_Counter,"MyService.MyService()");
- }
- public void MyMethod()
- {
- m_Counter++;
- string sessionID = OperationContext.Current.SessionId;
- Trace.WriteLine("Service session ID: " + sessionID);
- MessageBox.Show("Counter = " + m_Counter,"MyService.MyMethod()");
- }
- public void Dispose()
- {
- MessageBox.Show("Thread ID = " + Thread.CurrentThread.
ManagedThreadId,"MyService.Dispose()");- }
- }
以上就是我們為大家介紹的有關WCF會話服務的相關內容。