2012-07-10 73 views
0

我已經做了一個相當簡單的示例來演示實例管理的每個呼叫模式。 我已經使用了靜態變量計數器來增加每個實例的計數,並且我已經將實例模式指定爲perCall。計數變量的預期行爲應該不應該增加,因爲實例按照每個請求進行處理,但觀察到的行爲是計數器變量對於每個請求連續增加,甚至對於新客戶端也是如此。WCF中的實例管理的每個呼叫模式不起作用

這是我的服務代碼

namespace PerCallInstanceService 
{ 
    [ServiceContract] 
    public interface IMyService 
    { 
     [OperationContract] 
     int MyMethod(); 

    } 
} 

namespace PerCallInstanceService 
{ 
    [ServiceBehavior(InstanceContextMode=InstanceContextMode.PerCall)] 
    public class MyService :IMyService 
    { 
     public int m_Counter=0; 

     #region IMyService Members 

     public int MyMethod() 
     { 
      m_Counter++; 
      return m_Counter; 
     } 


     #endregion 
    } 
} 

這是客戶端代碼。

Console.WriteLine("Service Instance mode: Per-Call"); 

Console.WriteLine("Client making call to service..."); 

MyServiceClient proxy = new MyServiceClient(); 

Console.WriteLine("Counter:" + proxy.MyMethod()); 

Console.WriteLine("Counter:" + proxy.MyMethod()); 

Console.WriteLine("Counter:" + proxy.MyMethod()); 

Console.WriteLine("Counter:" + proxy.MyMethod()); 

Console.ReadLine(); 

我的ServiceHost:

+0

(InstanceContextMode = InstanceContextMode.PerSession)將保留會話狀態,除非調用proxy.Close()/ Abort。 – rt2800 2012-07-10 12:05:07

+0

對不起,這實際上是InstanceContextMode.PerCall。我遇到了PerCall模式的上述問題。編輯上述.. – user1208862 2012-07-10 12:54:29

+0

您可以在創建ServiceHost的地方發佈代碼嗎? – JohnC 2012-07-10 13:01:27

回答

0

您必須使用InstanceContextMode.PerCall不InstanceContextMode.PerSession

+0

對不起,錯字,它實際上是InstanceContextMode.PerCall。我遇到了PerCall模式的上述問題。 – user1208862 2012-07-10 12:54:01

+0

代碼看起來一切正常,請檢查您的部署,即您的客戶端是否指向更新的服務 – 2012-07-11 04:47:57

+0

Up?你找到解決方案嗎?我在同一個問題上 – user1147981 2014-04-10 08:01:53

0

你的問題指出, 「我使用了一個靜態變量計數器增加計數」 ,但是你的代碼沒有靜態變量。 但是,如果您使用的是靜態,那麼即使它是PerCall並且儘管在每次調用時都會重新創建對象,計數器仍會繼續增加。靜態變量保持在每次調用時創建的對象實例之外。一旦創建了一個對象,相應的靜態變量將保留在內存中,直到程序集被卸載。