WCF сервис и синглтоны - PullRequest
       12

WCF сервис и синглтоны

2 голосов
/ 14 ноября 2011

У меня есть служба WCF, работающая на IIS.

Каждый раз, когда пользователь входит в систему (с именем пользователя и паролем), я создаю SessionClass, который делает что-то каждые несколько минут в потоке и обрабатывает пользовательские запросы.

Я сохраняю каждый новый SessionClass, созданный в Словаре, в одиночном ServiceClass.

Если пользователь ничего не запрашивает в течение длительного периода времени (скажем, 10 часов), сеанс должен прекратиться. Я уничтожаю поток и удаляю SessionClass из словаря в синглтоне ServiceClass.

Моя проблема в том, что каждый раз, когда я удаляю SessionClass из Словаря, он снова делает экземпляр ServiceClass пустым, а в следующий раз, когда он вызывается, он создается снова, поэтому я теряю все сеансы, которые я использовал для хранения в словарь ...

Я пытался удерживать прямую ссылку внутри службы WCF на ServiceClass.GetInstance () (я думал, что сборщик мусора убивает ServiceClass), но это не поможет ...

Почему это происходит? Есть идеи?

1 Ответ

1 голос
/ 14 ноября 2011

Объявите ваш словарь как статическое поле.

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

Обновление
На основании вашего комментария кажется, что IIS перезапускает AppPool и / или AppDomain. В любом случае ваш домен приложений выгружается, поэтому вся информация, хранящаяся в памяти, будет потеряна.

Тесс Феррандес написала очень хороший пост в блоге о том, почему IIS делает это здесь

Обновление 2
Если потерять данные просто неудобно, вы можете вместо этого попробовать разместить свой сервис в качестве управляемой службы Windows . Сценарий, включаемый управляемым параметром размещения службы Windows, - это сценарий долго работающей службы WCF, размещенной вне IIS в безопасной среде, которая не активируется сообщениями. Срок службы службы контролируется операционной системой. Однако, если крайне важно, чтобы ваши данные никогда не терялись, вам необходимо добавить механизм сохранения (база данных, сохранить в файле на диске и т. Д.) И выполнить чтение / запись туда.

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