2012-07-10 71 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并且尽管在每次调用时都会重新创建对象,计数器仍会继续增加。静态变量保持在每次调用时创建的对象实例之外。一旦创建了一个对象,相应的静态变量将保留在内存中,直到程序集被卸载。