瞬間了解WCF會話服務方式
之前我們對單調服務做了詳細的介紹,這里就不多說了,這里就WCF會話服務簡單分析一下。WCF會話服務(Sessionful Service):則為每次客戶端連接分配一個服務實例。類似于Net Remoting的客戶端激活模式。為每個客戶端創(chuàng)建一個專門的服務實例。只要會話沒有結束,該實例就不會被銷毀。 對于會話服務而言,是一個客戶端代理對應一個服務實例。也就是說,會話服務中的服務是與代理相對應的,而不是對應于一個客戶端。
配置開發(fā):
服務實例的默認激活方式為會話服務模式。我們也可以顯示配置會話服務的方式,使用[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)],具體代碼如下所示:
服務類.WCF 會話服務
- [ServiceBehavior(InstanceContextModeInstanceContextMode = InstanceContextMode.PerSession)]
- public class WCFServicePerSession : IWCFService
- {
- }
#T#服務配置[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]之后,需要在服務契約一級配置 [ServiceContract(SessionMode=SessionMode.Allowed)],服務元數(shù)據(jù)將包含SessionMode值??蛻舳说腤CF反序列化后會包含此信息,來確定服務是否使用了會話模式,SessionMode為枚舉類型:
- public enum SessionMode
- {
- Allowed,
- Required,
- NotAllowed
- }
不是所有的綁定協(xié)議都支持會話傳輸模式,TCP協(xié)議為傳輸控制協(xié)議,會與客戶端維護一個連接。而HTTP為無連接狀態(tài),我們無法保證其與客戶端的會話連接。
注意:
(1)WCF會話服務存在可伸縮性的問題。由于每個客戶端都需要維護一個會話,需要占用較多的資源來保存服務會話狀態(tài)。如果存在多個獨立的客戶端,則創(chuàng)建專門的服務實例的代價太大。
(2)WCF服務綁定協(xié)議與會話特性之間的關系見下表。
(3) 應該避免將單調服務與會話契約混合定義在相同的會話服務類型中,會話應該保證是可靠的,一個實現(xiàn)了會話契約的服務,它包含的所有終結點所公開的契約都應該使用支持可靠傳輸會話的綁定。
(4) InactivityTimeout可以配置一個新的空閑超時值,服務實例空閑時間超過這個范圍時候就會終止會話。InactivityTimeout屬性的默認值為10分鐘。不能將該值設置為小于或等于0的值,否則會拋出ArgumentOutOfRangeException異常。