岁差& Per Call返回相同的值

时间:2011-12-14 16:03:42

标签: wcf

以下是代码段

服务器代码:

   namespace WcfService3
{
    [ServiceContract]
    public interface ICalculator
    {     
        [OperationContract]
        string GetCount();
    }
}


[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class Calculator : ICalculator
{
    int count = 0;

    public string GetCount()
    {
        count++;
        return "Thread ID : " + Thread.CurrentThread.ManagedThreadId.ToString() + " Counter value : " + count.ToString();
    }
}

客户代码

class Program
    {
        static void Main(string[] args)
        {
            ICalculator calculator = new ServiceReference2.CalculatorClient();

            for (int index = 1; index <= 10; index++)
            {
                Console.WriteLine(calculator.GetCount());
            }

            Console.ReadLine();
        }
    }

如果我将InstanceContextMode设置为InstanceContextMode.Persession或InstanceContextMode.PerCall,我会得到相同的结果。

主题ID:34计数器值:1 线程ID:34计数器值:1 线程ID:34计数器值:1 线程ID:34计数器值:1 线程ID:34计数器值:1 线程ID:34计数器值:1 线程ID:34计数器值:1 线程ID:34计数器值:1 线程ID:34计数器值:1 线程ID:34计数器值:1

使用InstanceContextMode.Single,Counter值增加,这是预期的行为。 线程ID:34计数器值:1 线程ID:34计数器值:2 线程ID:34计数器值:3 线程ID:34计数器值:4 线程ID:34计数器值:5 线程ID:34计数器值:6 线程ID:34计数器值:7 线程ID:34计数器值:8 线程ID:34计数器值:9 主题ID:34计数器值:10

我无法理解为什么计数器的值不随PerCall而增加。有人可以解释一下吗?

阿图尔

2 个答案:

答案 0 :(得分:0)

使用PerCall,您将获取计算器服务的新实例,以便重置计数变量。使用PerSession,您将在会话到期之前使用相同的实例。

查看thisthis

答案 1 :(得分:0)

刚发现我们必须明确启用PerSession的会话才能正常工作。将代码修改为

[ServiceContract(SessionMode=SessionMode.Required)] 
public interface ICalculator 
{ 

[OperationContract] 
string GetCount(); 

} 

现在Persession也在增加。