WCF服务PerSession像Singleton一样运行?

时间:2011-06-23 13:39:44

标签: wcf session

您好,

我有一个看起来像这样的服务:

[ServiceBehavior(Name = "MyAppClientService", Namespace = "http://MyApp.ServiceContracts/2007/11", InstanceContextMode = InstanceContextMode.PerSession)]
    public class MyAppClientService : IMyAppClientService

[ServiceContract(Namespace = "http://MyApp.ServiceContracts/2007/11", Name = "IMyAppClientService", SessionMode = SessionMode.Required, CallbackContract = typeof(IMyAppClientServiceCallback))]
    public interface IMyAppClientService

在服务上我得到了像这样的singelton类>

public class SharedContext
{
    protected Dictionary<Guid, UserContextOnService> _userContextDictionary = new Dictionary<Guid, UserContextOnService>();
         public static SharedContext Instance
    {
        get
        {
            if (_instance == null)
                _instance = new SharedContext();

            return _instance;
        }
    }
}

首先我用client1登录,我可以看到userContextDictionary只包含一个(正确)。然后我用client2登录(当client1正在运行时),然后我可以看到userContextDictionary的计数为2?

这是如何工作的?该服务设置为PerCall?这是否意味着每个会话都有自己的服务实例?

我正在寻找一个singelton服务解决方案,但我好奇这是如何工作的?如果服务在不同的实例中运行,那么它应该不能共享数据吗?

BestRegards

1 个答案:

答案 0 :(得分:1)

您的SharedContext单例非常差,因为它还没有为多线程环境做好准备。检查this article它是否描述了如何正确使用它。

你究竟要求什么?你有一个访问单身的服务,拿着一些字典 - 服务的实例化模式并不重要。您仍然拥有整个应用程序域的单个字典,因为singleton只对您的所有服务实例都有一个。

如果您希望同时访问字典中的共享数据(看起来像您想要的那样),您还应该在那里处理一些同步或使用ConcurrentDictionary代替。