Обнаружение отключения клиента с помощью PushStreamContent в веб-API

Хотя HTTP является протоколом без сохранения состояния, есть этот класс PushStreamContent, который облегчает отправляемые сервером события, как вы можете прочитать здесь. Реализация Web API может хранить клиентские потоки и периодически отправлять push-обновления. Однако определить, когда клиент отключается, немного проблематично.

В этом обсуждении Хенрик Нильсен заявляет, что:

Обнаружение того, что TCP-соединение было сброшено, контролируется хостом (ASP, WCF и т. Д.), Но в.NET 4 ни ASP, ни WCF не сообщают нам (уровень Web API) об этом. Это означает, что единственный надежный способ обнаружить разорванное соединение - фактически записать в него данные. Вот почему у нас есть пример try / catch для операции записи в примере. То есть ответы будут очищаться, когда они терпят неудачу, а не раньше.

В.NET 4.5 есть механизм для обнаружения разъединения клиента, но я не пробовал его.

Перенесемся через два с половиной года на сегодня. Кто-нибудь знает, что это за механизм и работает ли он?

1 ответ

Интересным ответом был пост по этой ссылке: ссылка на статью

это часть ответа

В.NET 4.5 есть механизм для обнаружения разъединения клиента, но я не пробовал его.

Этот (упрощенный) код работает для меня:

public HttpResponseMessage Get (запрос HttpRequestMessage)

{

// Зарегистрируйтесь для получения уведомлений об отключении клиента

объект clientId = ...; // это объект, переданный обратному вызову

System.Web.HttpContext.Current.Response.ClientDisconnectedToken.Register(

делегат (объект obj)

{

// Клиент чисто отключился

// obj - это clientId, переданный в регистр

// обрабатывать отключение клиента

//...

}

, ID клиента);

// Нормальный код из образца продолжается

response.Content = new PushStreamContent (...);

}

Обратный вызов ClientDisconnect вызывается, если, например, вы аккуратно закрыли страницу браузера клиента, но если вы вытянули сетевой кабель, он не получил уведомления. Таким образом, для этого нечистого разъединения нам все еще нужен какой-то другой способ обнаружения этого, такой как мониторинг сбоев во время обратного вызова таймера.

Другие вопросы по тегам