天天看點

wcf入門(6)——服務會話

本文demo已上傳至github:xinyuehtx/WCFdemo

這個部落格會介紹如何設定服務的會話

會話(Session)

還記得wcf入門(5)——雙工模式_wcf,c#_黃騰霄的部落格-CSDN部落格中提到的雙工模式麼?

大家有沒有疑問為什麼服務端能夠知道該向誰回複消息呢?

有人可能會說因為我們例子裡面的TCP是面向連接配接的。

可是系統提供的WSDualHttpBinding也是支援雙工的,但是它的通道是無狀态的Http協定

另外對于多個服務操作調用,有時我們需要它們之間有一些狀态共用,那麼也需要有一個方式将一系列消息關聯在一起。

這些情況就需要用到會話。微軟官方将會話定義為:在兩個終結點之間發送的所有消息的一種互相關系。

會話有顯式的啟動和終止。在此期間所有的消息都是屬于會話的一部分

使用會話

wcf入門(6)——服務會話

如圖所示,使用會話時需要在服務協定設定

SeesionMode

。對于

Required

指該服務必須使用會話

此外,還需要選取兩個操作,通過

IsInitialting

IsTerminating

設定會話的啟動和終止

wcf入門(6)——服務會話

在服務實作上,對于

SayHello

方法,傳入用戶端的name并且儲存為字段。在其後所有的回複中都帶上name

注意這裡我們還設定了一個

ServiceBehavior

,并且指定

InstanceContextMode

PerSession

。這個是設定整個會話的生命周期内,隻使用服務類的單個執行個體。執行個體化的具體内容會在後續部落格中介紹

wcf入門(6)——服務會話

我們看下用戶端的調用,依次調用會話啟動方法,其餘方法,會話終止方法。

wcf入門(6)——服務會話

我們可以看到所有的回複都帶上了用戶端在會話啟動方法傳入的name

會話的問題

在WCF中用戶端是通過一個通道建立了服務的透明代理。而當會話終止時,相應的通信通道也會關閉。這時候我們如果繼續在已經關閉的通道上通信就會引發異常。

wcf入門(6)——服務會話
wcf入門(6)——服務會話

當然如下所示的嘗試在這個通過再次建立會話也是不可以的。

wcf入門(6)——服務會話

如果需要重新同服務端通信,則需要再次執行個體化一個SessionClient

wcf入門(6)——服務會話
wcf入門(6)——服務會話

小結

我們研究了WCF服務的會話,其特點有

  • 可以實作一組消息互相關聯
  • 需要顯示啟動和終止
  • 終止後通過會關閉,再次通信需要重新執行個體化用戶端

參考連結:

  • 如何:建立要求會話的服務 - Microsoft Docs
  • 會話、執行個體化和并發 - Microsoft Docs

本文會經常更新,請閱讀個人部落格原文: https://xinyuehtx.github.io/ ,以避免陳舊錯誤知識的誤導,同時有更好的閱讀體驗。

wcf入門(6)——服務會話

本作品采用 知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協定 進行許可。歡迎轉載、使用、重新釋出,但務必保留文章署名黃騰霄(包含連結: https://xinyuehtx.github.io/ ),不得用于商業目的,基于本文修改後的作品務必以相同的許可釋出。如有任何疑問,請 與我聯系 。