在WCF操作契約的設計中,有時會有一些調用順序的業務,有的操作不能最先調用,有的操作必須最后調用,比如在從一個箱子里拿出一件東西的時候,必須先要執行打開箱子的操作,而關上箱子的操作應該在一切工作完成之后再被執行。
public interface Box
{
void Open(int boxId);
int GetTotalFrenchletter();
void Close();
}
為了解決這種實際需求,WCF在OperationContractAttribute中提供了IsInitiating和IsTerminating屬性,IsInitiating的默認值為true,表示當前操作可以被第一個調用,IsTerminating屬性默認為false,表示在這個方法執行完之后,服務對象不會被釋放。可以通過這兩個屬性來控制上文中提供的需求。
此外,在修改了默認值之后,在裝在服務的時候,WCF會去驗證服務契約是否被定義為sessionMode.Required,如果不是,WCF會拋出InvalidOperationExample異常。
上文中的契約定義可以被重新設計:
[ServiceContract(SessionMode=SessionMode.Required)]
public interface Box
{
[OperationContract(IsInitiating=true,IsTerminating=false)]
void Open(int boxId);
[OperationContract(IsInitiating = false, IsTerminating = false)]
int GetTotalFrenchletter();
[OperationContract(IsInitiating = false, IsTerminating = true)]
void Close();
}
Open方法上的Attribute和不去添加它是一樣的含義,只不過看起來更加清晰一點
有一點需要注意的是,參照以上的契約定義,在Close調用執行完之后,WCF會異步的釋放對象并且關閉會話,客戶端將不能再通過當前代理調用服務中的操作。
在服務的生命周期中,上下文是一直伴隨著服務實例的創建于釋放的整個過程的,然后處于某些目的,WCF也提供了分離兩者的選項,允許服務實例被單獨的停止。方法就是設置OperationBehaviorAttribute的ReleaseInstanceMode屬性,它是一個名為ReleaseInstanceMode的枚舉類型,包含了AfterCall、BeforeCall、BeforeAndAfterCall和None四個值,默認值為None。
BeforeCall:將在調用當前操作之前,WCF會釋放當前的服務實例,然后創建一個新的實例取代它,然后在這個新的實例上調用方法;
AfterCall:將在調用當前操作之后釋放當前服務實例;
BefireAndAfterCall:它是對前兩種設置的一種補充,OperationBehavior如果應用了這個值,那么當前方法可以在標記了BeforeCall或者None的方法之后調用,也可以在在標記了AfterCall或者None的方法之后調用.
而在上文中的示例中,我們可以做如下的定義
public class Box : IBox
{
public void Open(int boxId)
{
throw new NotImplementedException();
}
public int GetTotalFrenchletter()
{
throw new NotImplementedException();
}
[OperationBehavior(ReleaseInstanceMode=ReleaseInstanceMode.AfterCall)]
public void Close()
{
lockBox();
}
}
即使如此,WCF仍然提供了一個直接停止服務實例的方法,以滿足在以上設置中都沒有找到一個完美的適用于您的需求的解決方案。然后再非不得已的情況下,應該盡量不要使用它,因為它破壞了業務邏輯和服務本身生命周期的分離。
方法很簡單,在OperationContext中存在InstanceContext,而這個屬性包含一個ReleaseServiceInstance方法,在這個方法調用之后服務將會被釋放:
[OperationBehavior(ReleaseInstanceMode=ReleaseInstanceMode.AfterCall)]
public void Close()
{
lockBox();
OperationContext.Current.InstanceContext.ReleaseServiceInstance();
}
然后,以上所述的技術,僅僅是WCF提供的一些對于特殊需求的優化技術,通常情況下不必去可以使用它。
新聞熱點
疑難解答