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