wcf服務的狀態

默認wcf服務的類是無狀態的,就像web service一樣,不能保存狀態信息。即每次調用都是創建一個新的對象,所以一般我們都不會在wcf服務類中添加屬性。
上面只是默認情況,因爲wcf爲我們提供了配置選項,我們只需顯式指定ServiceBehaviorAttribute的InstanceContextMode的值即可實現有狀態的服務,還可以實現全局的。ServiceBehavior是一個類特性,所以我們不能在接口上應用。InstanceContextMode是一個枚舉類型,包含PerCall,PerSession,Single三個值。從字面上我們就可以看出他們的意思。注意服務的狀態其實是與客戶端代理類有相同的生命週期,也就是說我們可以通過調用客戶端代理類的close方法來顯示清除一個服務類的狀態信息。另外,BasicHttpBinding的binding是沒有狀態的,所以我們不能用這個bind來讓服務類保持狀態。
PerCall
 每次調用都會創建新的對象,雖然我們沒有顯式創新,但代理對象會幫我們做這些。如
服務端
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
    public class EmployeeService : IEmployeeService
    {
        private int count = 0;

        #region IEmployeeService Members

        public void ShowInvokeNumber()
        {
            count++;
            Console.WriteLine("count = {0}", count);
        }

        #endregion
    }

客戶端
EmployeeServiceProxy proxy = new EmployeeServiceProxy("netEmployeeService");
    proxy.ShowInvokeNumber();
    proxy.ShowInvokeNumber();
    proxy.ShowInvokeNumber();
雖然我們只創建了一個代理對象,服務器端的對象會在每次調用完後進行釋放,當再次調用時,會創建一個新的對象。

PerSession
簡單的說它每個客戶端共享一個對象,只在第一次調用時創建。

Single
是所以客戶端共享一個對象。

通過我提供的演示demo,可以很清楚看到這其中的差別。注意服務器端的輸出
percall輸出的是
count = 1
count = 1
count = 1
persession輸出的是
count = 1
count = 2
count = 3
如果我們多啓動一個客戶端則會有增加如下輸出
count = 1
count = 2
count = 3
single輸出的是
count = 1
count = 2
count = 3
增加一個客戶端,輸入變爲
count = 4
count = 5
count = 6

還有一個OperationBehavior應用於操作上的特性我們需要注意,它的ReleaseInstanceMode指定了4個枚舉值。默認是None,還有AfterCall,BeforeAndAfterCall,BeforeCall,如果應用了這個特性,則對象在調用這個方法時會檢查OperationBehavior特性的ReleaseInstanceMode的值,它如果它指定爲非none,則在調用根據設置的值來在調用前或後釋放該對象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章