8

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

   [ServiceContract(SessionMode = SessionMode.Required) ]

和一些静态字段。我认为通过会话,每个会话的静态字段将保持不变,但对于不同的会话有新的实例。但是,当我有两个不同的客户端使用该服务时,我看到的是,当一个客户端更改字段的值时,此更改也会影响另一个客户端。这是进行不同会话的正常行为吗?还是您认为我的服务甚至可能不会创建不同的会话?

我正在使用 netTCPbinding。

4

3 回答 3

10

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

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
public class Service : IService
{
    private string sessionVariable;         // separate for each session

    private static string globalVariable;   // shared across all sessions
}
于 2013-07-25T19:56:12.763 回答
4

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

于 2013-07-25T19:55:40.490 回答
3

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

于 2013-07-26T03:48:18.807 回答