WCF服务中跨会话持久化的静态变量

本文关键字:静态 变量 持久化 会话 服务 WCF | 更新日期: 2023-09-27 18:24:54

我有一个WCF服务,需要会话

   [ServiceContract(SessionMode = SessionMode.Required) ]

以及一些静态场。我认为通过拥有会话,每个会话的静态字段将保持不变,但不同会话会有新的实例。然而,当我有两个不同的客户端使用该服务时,我看到的是,当一个客户端更改字段的值时,这种更改也会影响另一个客户端。这是不同会话的正常行为吗?或者你认为我的服务可能甚至没有创建不同的会话?

我正在使用netTCPbinding。

WCF服务中跨会话持久化的静态变量

静态变量在整个过程中共享,因此您可以看到行为。但是,如果您将服务的实例上下文模式设置为每个会话,那么该服务实例及其(非静态)变量将按会话创建。因此,这里somevar对于会话是唯一的:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
public class Service : IService
{
    private string sessionVariable;         // separate for each session
    private static string globalVariable;   // shared across all sessions
}

静态字段在应用程序的生命周期中是全局的。所以不同的客户端看到相同的静态变量。如果您希望每个客户端都有"静态变量",那么您必须将其存储在该用户的会话状态中的某个位置(我不太了解WCF,所以我不知道这在WCF上下文中到底意味着什么)

静态变量的作用域是ApplicationDomain,这是因为您的实际Type(从中创建实例的类)在应用程序域中加载一次,它的所有静态变量和与之相关的方法也是如此。因此,即使您有多个实例或一个服务实例,它们也会共享静态变量。