本文demo已上傳至github:xinyuehtx/WCFdemo
這個部落格會介紹如何設定服務的會話
會話(Session)
還記得wcf入門(5)——雙工模式_wcf,c#_黃騰霄的部落格-CSDN部落格中提到的雙工模式麼?
大家有沒有疑問為什麼服務端能夠知道該向誰回複消息呢?
有人可能會說因為我們例子裡面的TCP是面向連接配接的。
可是系統提供的WSDualHttpBinding也是支援雙工的,但是它的通道是無狀态的Http協定
另外對于多個服務操作調用,有時我們需要它們之間有一些狀态共用,那麼也需要有一個方式将一系列消息關聯在一起。
這些情況就需要用到會話。微軟官方将會話定義為:在兩個終結點之間發送的所有消息的一種互相關系。
會話有顯式的啟動和終止。在此期間所有的消息都是屬于會話的一部分
使用會話
如圖所示,使用會話時需要在服務協定設定
SeesionMode
。對于
Required
指該服務必須使用會話
此外,還需要選取兩個操作,通過
IsInitialting
和
IsTerminating
設定會話的啟動和終止
在服務實作上,對于
SayHello
方法,傳入用戶端的name并且儲存為字段。在其後所有的回複中都帶上name
注意這裡我們還設定了一個
ServiceBehavior
,并且指定
InstanceContextMode
為
PerSession
。這個是設定整個會話的生命周期内,隻使用服務類的單個執行個體。執行個體化的具體内容會在後續部落格中介紹
我們看下用戶端的調用,依次調用會話啟動方法,其餘方法,會話終止方法。
我們可以看到所有的回複都帶上了用戶端在會話啟動方法傳入的name
會話的問題
在WCF中用戶端是通過一個通道建立了服務的透明代理。而當會話終止時,相應的通信通道也會關閉。這時候我們如果繼續在已經關閉的通道上通信就會引發異常。
當然如下所示的嘗試在這個通過再次建立會話也是不可以的。
如果需要重新同服務端通信,則需要再次執行個體化一個SessionClient
小結
我們研究了WCF服務的會話,其特點有
- 可以實作一組消息互相關聯
- 需要顯示啟動和終止
- 終止後通過會關閉,再次通信需要重新執行個體化用戶端
參考連結:
- 如何:建立要求會話的服務 - Microsoft Docs
- 會話、執行個體化和并發 - Microsoft Docs
本文會經常更新,請閱讀個人部落格原文: https://xinyuehtx.github.io/ ,以避免陳舊錯誤知識的誤導,同時有更好的閱讀體驗。
本作品采用 知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定 進行許可。歡迎轉載、使用、重新釋出,但務必保留文章署名黃騰霄(包含連結: https://xinyuehtx.github.io/ ),不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。如有任何疑問,請 與我聯系 。