WCF InstanceContextMode.PerSession
本文关键字:PerSession InstanceContextMode WCF | 更新日期: 2023-09-27 18:32:25
如果我使用这个: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].
}
此处编写的服务使用 ServiceBehavior.ReleaseServiceInstanceOnTransactionComplete
属性的默认值,即 true
。
这意味着通过TransactionScopeRequired
强制执行事务范围的方法将导致释放服务实例,并且下次调用方法时,尽管您需要InstanceContextMode
,但仍会创建一个新实例。
将相关属性更改为false
应该可以解决问题。
看起来像每次客户端调用服务时创建的服务的新实例。 这可能是因为客户端终止了会话(和构造函数)。 例如客户端关闭代理,在这种情况下,下次客户端调用服务时,将创建新会话。 您是否检查过每次连接到服务时都没有关闭代理?