WCF InstanceContextMode.PerSession

时间:2012-04-26 17:50:14

标签: c# wcf

如果我使用它:InstanceContextMode.PerSession,然后为每个客户端我初始化我的服务一次。我是对的吗?

如果我调用具有[OperationBehavior(TransactionScopeRequired = true)]的方法,则会调用JobImplement构造函数。为什么?

我的服务:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class JobImplement : IJob
    {
        public static int Sum = 0;
        public JobImplement()
        {
            Sum++;
        }
        [OperationBehavior(TransactionScopeRequired = true)]
        public void UselessMethod1()
        {
        }
        [OperationBehavior(TransactionScopeRequired = true)]
        public void AddEmployee(string Name, string Age)
        {
        }
        public int GetSum()
        {
            return Sum;
        }
    }

编辑1:

我正在使用WSHttpBinding绑定,这是我唯一的客户端代码。

我的客户:

static void Main(string[] args)
        {
            ServiceReference1.IJob Service1 = new ServiceReference1.JobClient();
            Service1.UselessMethod1();//sum become [1]
            Service1.AddEmployee("","");//sum become [2]
            Console.WriteLine(Service1.GetSum());//show [2].
            Console.WriteLine(Service1.GetSum());//show [2].
            Console.WriteLine(Service1.GetSum());//show [2].
        }

2 个答案:

答案 0 :(得分:2)

此处编写的服务使用ServiceBehavior.ReleaseServiceInstanceOnTransactionComplete属性的默认值,即true

这意味着通过TransactionScopeRequired强制执行事务范围的方法将导致服务实例被释放,并且下次调用方法时,即使您需要InstanceContextMode,也会创建一个新实例。

将相关属性更改为false可以解决问题。

答案 1 :(得分:0)

看起来每次客户端调用您的服务时都会创建新的服务实例。这可能是因为客户端终止了会话(和你的构造函数)。例如客户端关闭代理,在这种情况下,下次客户端调用服务时,将创建新会话。您是否在每次连接服务时检查是否没有关闭代理?