如果我使用它: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].
}
答案 0 :(得分:2)
此处编写的服务使用ServiceBehavior.ReleaseServiceInstanceOnTransactionComplete
属性的默认值,即true
。
这意味着通过TransactionScopeRequired
强制执行事务范围的方法将导致服务实例被释放,并且下次调用方法时,即使您需要InstanceContextMode
,也会创建一个新实例。
将相关属性更改为false
可以解决问题。
答案 1 :(得分:0)
看起来每次客户端调用您的服务时都会创建新的服务实例。这可能是因为客户端终止了会话(和你的构造函数)。例如客户端关闭代理,在这种情况下,下次客户端调用服务时,将创建新会话。您是否在每次连接服务时检查是否没有关闭代理?