Как обнаружить отключение, как только оно происходит на ASP.NET без опроса?

У меня есть обработчик событий, отправленных сервером в ASP.NET.

Response.ContentType = "text/event-stream";
while (true)
{
   if(thereIsAMessage)
   {
       Response.Write(message);
       Response.Flush();
       if (Response.IsClientConnected == false)
       {
           break;
       }
   }

   System.Threading.Thread.Sleep(1000);
}

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


person Jader Dias    schedule 19.03.2012    source источник
comment
Вы можете поместить проверку isClientConnected() после функции Sleep(...). Что вы имеете в виду, говоря, что не хотите объединять его?   -  person ZippyV    schedule 20.03.2012
comment
@ZippyV не имеет значения, где проверено Response.IsClientConnected. Я пытался поставить его после вызова метода Sleep, но безрезультатно.   -  person Jader Dias    schedule 20.03.2012
comment
@ZippyV Я не хочу объединять клиентов, отправляющих пустые сообщения, только для того, чтобы проверить, жив ли он.   -  person Jader Dias    schedule 20.03.2012
comment
Вам нужно слово poll, а не pool.   -  person Matt Ellen    schedule 13.07.2012


Ответы (2)


Попробуйте посмотреть на SignalR - полезно для длинных опросов, уведомления сервера не составит труда реализовать. Использует веб-сокеты, когда они доступны. Ваш сценарий можно очень легко реализовать с помощью хабов.

person Karel Frajták    schedule 19.03.2012
comment
Не удалось установить пакет «Microsoft.WebSockets 0.2.1». Вы пытаетесь установить этот пакет в проект, предназначенный для .NETFramework, Version = v4.0, но пакет не содержит ссылок на сборки, совместимых с этой платформой. Для получения дополнительной информации свяжитесь с автором пакета. - person Jader Dias; 19.03.2012
comment
вы устанавливаете его с помощью Nuget? - person Karel Frajták; 19.03.2012
comment
Да. Это Nuget дает мне это сообщение. Я пытался изменить версии Target Framework, но безрезультатно. - person Jader Dias; 20.03.2012

Если вы хотите сделать это в своем собственном коде, вы можете просто изменить свой пример:

Response.ContentType = "text/event-stream";
while (Response.IsClientConnected)
{
   if(thereIsAMessage)
   {
       Response.Write(message);
       Response.Flush();
   }

   System.Threading.Thread.Sleep(1000);
}

Но все же я не уверен, что это оптимальная реализация с использованием подхода Thread.Sleep.

person Nenad    schedule 08.10.2012