WCF: Как узнать, когда заканчивается сессия? - PullRequest
5 голосов
/ 07 мая 2010

У меня есть приложение WCF, которое использует сеансы.

Есть ли какое-либо центральное событие, которое будет вызвано после завершения сеанса?Как я могу узнать, когда заканчивается сеанс БЕЗ (!) Вызова метода (отключение от сети, сбой клиента - поэтому нет вызова метода «logout»)?

Сервер размещен как:

[ServiceBehavior(
    InstanceContextMode = InstanceContextMode.PerSession,
    ConcurrencyMode = ConcurrencyMode.Reentrant,
    UseSynchronizationContext = false,
    IncludeExceptionDetailInFaults = true
)]

В основном потому, что он использует интерфейс обратного вызова.

Теперь мне нужно разделить экземпляр, созданный из внутреннего хранилища, когда сеанс завершается;)

Есть идеи?

Ответы [ 3 ]

9 голосов
/ 16 ноября 2013
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
class MyService : IService
{
    public MyService()
    {
        // Session opened here
        OperationContext.Current.InstanceContext.Closed += InstanceContext_Closed;
        // get the callback instance here if needed
        // OperationContext.Current.GetCallbackChannel<IServiceCallback>()
    }

    private void InstanceContext_Closed(object sender, EventArgs e)
    {
        // Session closed here
    }
}

Код не будет работать для Single / PerCall InstanceContextMode.

4 голосов
/ 08 мая 2010

Хорошее описание контекста экземпляра здесь

Контекст экземпляра происходит от CommunicationObject

Объект связи имеет закрытие событие.

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

0 голосов
/ 17 мая 2010

Установите значения тайм-аута и создайте метод PingService (), который срабатывает непосредственно перед истечением тайм-аута, это сбросит тайм-ауты отправки и получения.

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

Нет способа изящно отловитьотключенный пользователь (сбой браузера, отключение питания и т. д. и т. п.)

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