что такое время жизни статического словаря |LifestyleTransient |C # |WCF - PullRequest
1 голос
/ 07 июня 2019

Я храню некоторую информацию в статическом словаре, который определен в классе внутри сервисного компонента WCF, как показано ниже:

    public class UserAuthenticator : IUserAuthentication
    {                    

                public static ConcurrentDictionary<UserInfo, ConcurrentDictionary<string, BookingDetails>>BookingDetailsDictionary = new ConcurrentDictionary<UserInfo, ConcurrentDictionary<string, BookingDetails>>(new UserEqualityComparer());

                public static ConcurrentDictionary<string, Connector> connectorDictionary = new ConcurrentDictionary<string, Connector>();

      public BookingDetails Authenticate(UserInfo userInfo, ServiceDetails serviceDetail, XmlElement requestData)
            {
                var bookDetails = new BookingDetails();
                try
                {
                    ConcurrentDictionary<string, BookingDetails> dicObject = null;
                    if (bookingDictionary.TryGetValue(userInfo, out dicObject))
                    {...}
                    else 
                    {
                    //  call Database and get value from database and fill db value in to static ConcurrentDictionary
                    }
                }
            }
    }

Здесь я проверяю статический ключ ConcurrentDictionary, если значение не в словаре, затем вызвать базу данных и заполнить значение в словаре.

Ожидаемый вывод - первый раз вызвать службу wcf, затем вызвать базу данных и заполнить значение в ConcurrentDictionary, а затем после того, как все вызовы службы WCF прочитают данные из ConcurrentDictionary

Теперь проблемы иногда возникают из-за того, что статический счетчик ConcurrentDictionary обнуляется. И странная часть - пул приложений все еще активен. ни один пул приложений не перезагружается, все же случайно он вызывает базу данных, и иногда он берет данные из ConcurrentDictionary

Это действительно странно для меня. Я предполагаю, что статическая переменная будет держать свое значение до конца приложения. Но даже пул приложений не перезагружается или IIS не перезапускается, статическая переменная обнуляется.

Что вы предлагаете? Является ли использование переменных ConcurrentDictionary лучшим выбором?

Примечание. В своем приложении wcf я использовал инъекцию зависимостей в замок Виндзора, и класс UserAuthenticator регистрируется с LifestyleTransient(), как показано ниже

Component.For<IUserAuthentication, UserAuthenticator>().LifestyleTransient()

Посоветуйте, пожалуйста, лучшее решение

Заранее спасибо

1 Ответ

0 голосов
/ 12 июня 2019

Наконец-то я получил решение вышеуказанной проблемы

Поскольку я использовал статический ConcurrentDictionary в WCF проекте, а также реализовал веб-сад и статические переменные для каждого процесса, поэтому некоторое время он не работал в другом процессе с веб-гардерном

Решение теперь отключено, и он работает нормально, а в будущем будет реализовывать распределенный кеш, такой как (Radis, NCache и т. Д.) С веб-садом

Спасибо @mjwills и @ Shantanu за ценные комментарии

...