Событие Session_End за балансировщиком нагрузки - PullRequest
0 голосов
/ 28 января 2010

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

Предполагается, что Session_End вызывается по истечении срока действия. Я боюсь, что это ситуация, когда сессия создается на одном сервере, но заканчивается на другом. В этом случае я боюсь, что Session_End на первом сервере будет выполнен преждевременно, и я буду слишком рано вызывать веб-сервис. Что бы вы предложили в этой ситуации?

Edit:

Я помню, как некоторое время назад читал, как Sql Agent реагирует на событие завершения сеанса, а затем выполняет пользовательский код. Кто-нибудь может подтвердить, что это решение возможно?

Ответы [ 2 ]

2 голосов
/ 28 января 2010

Событие окончания сеанса не поддерживается, если вы не используете состояние сеанса в процессе. Вы можете посмотреть на ScaleOut Software StateServer. Я рассматриваю это для моей собственной среды. Он реализует распределенное состояние сеанса и поддерживает событие завершения сеанса.

Изменить, чтобы добавить больше информации:

Их веб-сайт объясняет это лучше, чем я могу ( страница с подробностями ), но вот краткое резюме. ScaleOut (или аналогичные гаджеты) используют распределенный кеш для управления состоянием сеанса. Это означает, что процесс на каждом из ваших серверов содержит данные сеанса. Процессы обмениваются данными между серверами, поэтому все данные распределяются между всеми серверами - независимо от того, какой сервер обрабатывает запрос пользователя, доступны одни и те же данные сеанса. Если один из ваших серверов выходит из строя, все данные сеанса сохраняются, поскольку они распределяются по всем серверам. Напротив, asp.net предоставляет состояние сеанса в процессе, которое работает только на одном сервере, сервер состояния сеанса, который хранит данные сеанса на отдельном сервере (одна точка отказа), или состояние сеанса сервера sql, что вполне надежный, но ухудшает производительность.

0 голосов
/ 28 января 2010

Разве это не то, почему вы храните информацию о сеансе в базе данных?

Это решает проблему «на каком сервере находится сеанс».

Как указано ниже, Session_End вызывается только для сессии inProc, которую вы не будете использовать.

...