Я храню некоторую информацию в статическом словаре, который определен в классе внутри сервисного компонента 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()
Посоветуйте, пожалуйста, лучшее решение
Заранее спасибо