2009-05-25 1 views
6

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

Клиентам необходимо получить некоторые данные с сервера - при появлении новых данных для клиента. Прямо сейчас, как это делается, клиент отслеживает веб-службу каждые x минут (скажем, 2 минуты) и продолжает проверять, есть ли новые данные для клиента.

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

Как это сделать - учитывая архитектуру решения - веб-приложение должно передавать данные в настольные приложения (клиенты) в одну и ту же сеть (ЛВС)?

ответ

7

Что вы описываете, это «серверный push», который в наши дни часто называют «COMET». Использование этих ключевых слов в веб-поиске должно включать много полезной информации.

Наиболее распространенная техника для этого называется «подвесной GET». Клиент отправляет запрос GET на определенный URL-адрес, и сервер принимает соединение, но задерживает отправку ответа, пока он не получит данные для отправки. Когда клиент получает ответ, он отправляет другое GET, чтобы он был готов к другому сообщению.

+1

Просто хотел отбросить заметку о том, что вы можете использовать IHttpAsyncHandler (http://msdn.microsoft.com/en-us/magazine/cc164128.aspx) и System.Threading.Monitor, чтобы легко создавать (сортировать) события, управляемые «push-сервер» в .NET 2.0 Если кто-то знает о полномасштабном классе утилиты для этого, напишите некоторые ссылки – Radu094

+0

Для каждого клиента сервер должен поддерживать одно соединение сокета. Так что это не сработает, когда нет. клиентов нельзя предсказать заранее. –

0

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

+0

Это приложение предназначено для общих интранет в промышленности. Использование соединений сокетов - то есть использование сокета потребует открытия порта для доступа - реконфигурации брандмауэра и т. Д. Является ли это разумным предварительным условием установки или обычно ли это будут промышленные клиенты? – Sameet

+0

HTTP-соединение _is_ a socket. Что ответ (правильно) рекомендуется, так это то, что клиент отправляет GET, но сервер откладывает ответ, пока он не будет готов к отправке. –

+0

Да, но HTTP-соединение находится на порту 80, который не блокируется брандмауэрами? То, что вы описали, звучит отлично - сервер откладывает ответ до тех пор, пока у него нет данных - как это сделать? – Sameet

2

Вы можете использовать обратные вызовы WCF - это веб-служба, в которой вы можете подписаться на уведомления от клиента, и сервер отправит сообщения подписчикам. У меня есть beginners guide в моем блоге.

+0

WCF? Так больше, чем просто .NET 2.0? К сожалению, .NET 2.0 - это ограничение, над которым мне нужно работать? Будут ли ответные вызовы WCF в этом случае? – Sameet

+0

Не бойся, боюсь, это только WCF, я боюсь. – blowdart

1

Возможно, вас заинтересует SO question. То, что вы описываете, звучит как приложение Comet - серверный клик для клиента.

1

Отъезд WebSync; это решение Comet для ASP.NET/IIS, но есть также доступный полный клиент .NET, который позволяет интегрироваться с толстыми клиентами, службами Windows и т. д. Таким образом, похоже, что он должен соответствовать счету довольно красиво.

Смежные вопросы