WCF狀態(tài)應(yīng)用基本概念簡(jiǎn)單描述
在WCF開發(fā)工具中,對(duì)于狀態(tài)的應(yīng)用是一個(gè)比較基礎(chǔ)的應(yīng)用技術(shù)。我們需要積累這方面的經(jīng)驗(yàn)來達(dá)到一個(gè)熟練應(yīng)用的地步。在接下來的文章中,我們首先為大家介紹一下WCF狀態(tài)應(yīng)用的一些基本概念。
WCF狀態(tài)應(yīng)用的設(shè)定是由以下兩步完成的,首先要在ServiceContract里面利用參數(shù)SessionMode來使Session有效化,具體代碼為
- [ServiceContract(SessionModeSessionMode=SessionMode.Required)];
其次是在ServiceBehavior里面利用參數(shù)InstanceContextMode來設(shè)定到底使用那一種Session方式,具體代碼如下
- [ServiceBehavior(InstanceContextModeInstanceContextMode=
InstanceContextMode.PerSession);
WCF支持的SessionMode有如下三種:#t#
◆SessionMode.Allowed:默認(rèn)選項(xiàng),允許但不強(qiáng)制使用Session。
◆SessionMode.NotAllowed:不允許使用Session。
◆SessionMode.Required:強(qiáng)制使用Session。
WCF支持的InstanceContextMode也有三種:
◆InstanceContextMode.PerCall:為User的每一次調(diào)用生成一個(gè)SessionID,Session生命周期:調(diào)用開始->調(diào)用結(jié)束。(注:這種方式和不使用Session功能應(yīng)該是一樣的)
◆InstanceContextMode.PerSession:為每一個(gè)用戶生成一個(gè)SessionID。Session生命周期:客戶端代理生成->客戶端代理關(guān)閉。(這種方式最像原先的Session)
◆InstanceContextMode.Single:生成一個(gè)唯一的SessionID,所有用戶共用,生命周期:Host創(chuàng)建->Host關(guān)閉。(應(yīng)用設(shè)計(jì)模式中的Singleton模式,像原先的Application)
WCF狀態(tài)應(yīng)用的實(shí)例是以PerSession為例,當(dāng)然,這里的Session和原來的Session還是有一些區(qū)別的,具體如下:
(1)并沒有一個(gè)顯示的Session容器供存放數(shù)據(jù)用;
(2)Session的銷毀和原先的Session不相同。
WCF中的Session可以在以下三種情況下銷毀:
(a)利用函數(shù)銷毀,如文中示例,在函數(shù)ReleaseSession()上用[OperationContract(IsTerminating=true)]表明客戶端可以通過調(diào)用該函數(shù)銷毀Session。
(b)客戶端代理關(guān)閉,Session也會(huì)自動(dòng)銷毀。
(c)通過TimeOut時(shí)間銷毀,默認(rèn)是10分鐘,這個(gè)時(shí)間客戶端和服務(wù)器端都可以設(shè)定,以較短的時(shí)間為有效時(shí)間。
因此,個(gè)人認(rèn)為,WCF中的Session的可控性更強(qiáng)一些。
在示例中還有一個(gè)問題要注意,在服務(wù)器端函數(shù)捕捉到異常之后,一定要通過throw new FaultException(ex.Message);的形式將錯(cuò)誤拋到客戶端,否則的話,客戶端調(diào)用用的Channel將會(huì)被堵塞,因此就無法繼續(xù)調(diào)用釋放資源的函數(shù)了。
要向客戶端拋異常必須設(shè)定WebConfig項(xiàng),具體代碼如下:
- < configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
- < system.serviceModel>< services>
- < !-- Before deployment, you should remove the returnFaults
behavior configuration to avoid disclosing information in exception messages -->- < service name="MyService" behaviorConfiguration="SessionTrans">
- < endpoint contract="IMyService" binding="wsHttpBinding"/>< /service>
- < /services>< behaviors>
- < serviceBehaviors>
- < behavior name="SessionTrans" returnUnknownExceptionsAsFaults="True">
- < serviceMetadata httpGetEnabled="true" />
- < serviceDebug includeExceptionDetailInFaults="true" />
- < /behavior>< /serviceBehaviors>< /behaviors>< /system.serviceModel>
- < system.web>< compilation debug="true"/>< /system.web>< /configuration>
以上介紹的WCF狀態(tài)應(yīng)用的相關(guān)知識(shí)供大家學(xué)習(xí)參考。