Служба WCF PerSession работает как Singelton? - PullRequest
0 голосов
/ 23 июня 2011

Привет,

У меня есть сервис, который выглядит так:

[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>> 1008 *

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?Разве это не означает, что у каждого сеанса есть свой экземпляр службы?

Я ищу решение для службы синглтон, но мне интересно, как это работает?Если служба работала в разных экземплярах, то у вас не должно быть возможности обмениваться данными?

BestRegards

1 Ответ

1 голос
/ 23 июня 2011

Ваш SharedContext синглтон довольно беден, потому что он не готов к многопоточному окружению.Проверьте в этой статье в ней описано, как сделать это правильно.

Что вы на самом деле просите?У вас есть служба, которая имеет доступ к одиночному хранилищу, содержащему некоторый словарь - режим экземпляра вашей службы не имеет значения.У вас все еще один словарь для всего домена приложения, потому что синглтон является единым для всех экземпляров службы.

Если вы хотите иметь одновременный доступ к общим данным в словаре (похоже, что вы хотите), вам также следуетобработайте некоторую синхронизацию или используйте ConcurrentDictionary.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...