WCF中的实例管理的每次调用模式不起作用

时间:2012-07-10 12:01:37

标签: c# wcf

我做了一个相当简单的示例来演示实例管理的Per Call模式。 我使用了一个静态变量计数器来增加每个实例的计数,我已经将实例模式指定为perCall。计数变量的预期行为应该不应该增加值,因为实例按每个请求处理,但观察到的行为是计数器变量针对每个请求连续递增,甚至对于新客户端。

这是我的服务代码

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();

我的服务主持人:

2 个答案:

答案 0 :(得分:0)

您必须使用InstanceContextMode.PerCall而不是InstanceContextMode.PerSession

答案 1 :(得分:0)

您的问题是,"我使用静态变量计数器来递增计数"但您的代码没有静态变量。 但是,如果你使用静态,那么计数器将继续增加,即使它是PerCall并且尽管在每次调用时都重新创建了对象。静态变量不在每次调用时创建的对象实例之外。创建对象后,相应的静态变量将保留在内存中,直到卸载程序集。