Изучение решений для уведомления клиентов WPF с сервера - PullRequest
16 голосов
/ 15 декабря 2011

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

Я хочу держаться подальше от старомодного опроса сервера. Это должно быть как можно ближе к реальному времени.

У меня никогда не было этого требования раньше, и я изучаю решения. Моей первой мыслью было использовать SignalR с .NET клиентом . Я еще не работал с SignalR, но похоже, что это может быть решением. Мне известно, что это абстракция для длинных опросов, событий, отправляемых сервером, и WebSockets, в зависимости от того, что доступно.

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

Ответы [ 6 ]

7 голосов
/ 15 декабря 2011

Это может быть сделано довольно легко с WCF и дуплексными контрактами .Вы можете определить операции, которые клиент может выполнять на сервере (как любой веб-сервис), и, кроме того, вы можете определить операции, которые сервер может выполнять на клиенте (т.е. обратный веб-сервис).Код мудрый, они оба просто вызовы методов.У клиента есть методы, которые вызывают операции на сервере, и он также должен предоставить объект, реализующий контракт обратного вызова, который является интерфейсом, который может вызывать сервер, и клиент должен предоставить реализацию.Все сериализации / десериализации данных и сообщений, а также все сетевые операции низкого уровня обрабатываются WCF, поэтому вам не придется об этом беспокоиться.

WCF поддерживает дуплексные контракты с использованием двух привязок (или «протоколов»):

  1. WSDualHttpBinding - Это влечет за собой двух прослушивателей HTTP на основе SOAP, одного на сервере и одного на клиенте.Когда клиент хочет связаться с сервером, он выполняет HTTP-запрос к серверу.Когда сервер хочет связаться с клиентом, он выполняет HTTP-запрос к клиенту.Преимущество этого подхода состоит в том, что любое сетевое соединение является мимолетным и не остается открытым (как в большинстве HTTP-соединений), и поэтому оно может поддерживать большое количество или одновременных клиентов.Основным недостатком является то, что он, вероятно, не будет работать с большинством клиентских компьютеров через Интернет, поскольку они обычно находятся за NAT (не проблема для межсерверных коммуникаций через Интернет или любого вида связи внутри интрасети или локальной сети).,Для получения дополнительной информации см. Мой другой ответ .

  2. NetTcpBinding - это в основном открывает сокет от клиента к серверу и сохраняет его открытымна время сеанса.Это позволяет осуществлять двустороннюю связь даже через NAT, но поскольку соединения должны оставаться открытыми, это несколько увеличивает нагрузку на сервер и, следовательно, сможет поддерживать менее параллельных пользователей (но, вероятно, в большинстве случаев их будет более чем достаточно).Это мой предпочтительный способ выполнения дуплексных контрактов в WCF, поскольку его легче начать работать и он более надежен.

Преимущество WCF заключается в том, что вы можете переключаться между двумя привязками, не меняякод.Все, что требуется, - это изменить конфигурацию (файл .config).

Какой бы способ вы ни выбрали, вы сможете осуществлять почти мгновенную связь в обоих направлениях (конечно, с учетом задержки в сети).Я не вижу необходимости в SignalR, когда в вашем распоряжении есть такая мощная, мощная и простая в использовании инфраструктура, как WCF.Если вы ограничены работой в браузере, тогда SignalR будет иметь смысл.Поскольку вы работаете в .NET, это может привести к ненужным трениям.

4 голосов
/ 16 декабря 2011

Смысл технологий, подобных SignalR, заключается в удовлетворении спроса на обмен данными в режиме реального времени между серверами и веб-клиентами.Они используют преимущества WebSockets и используют более старые / хакерские механизмы связи для старых веб-браузеров.

Если ваша среда будет локальной сетью, а ваш клиент - приложением .NET, вы можете использовать TCPServer и несколько TCPClients.Когда на вашем веб-сервере есть обновление / сообщение для отправки, сообщите об этом TCPServer (возможно, поместив сообщение на шину сообщений, которую он прослушивает), которая может информировать подключенных клиентов.Веб-технологии реального времени - отличный способ сделать это, но это действительно зависит от ваших текущих требований и ваших планов на будущее:

  • Хотите попробовать SignalR - Если да, то это сработает, и вам, вероятно, будет очень весело.Это также может быть полезно для будущих проектов и быть хорошей верёвкой.Если нет, то подход TCPClient и TCPServer может быть очень простым и более быстрым.
  • Требуется ли для других типов веб-клиентов возможность получать уведомления в будущем? - да, SignalR или другая более зрелая веб-технология реального времени может быть лучшим решением.Нет - TCPServer / Client
  • Планируете ли вы распространять данные за пределы вашей локальной сети? Да - вариант с самостоятельным размещением или событие размещенное решение с библиотеками .NETЭто может быть путь, поскольку они снимают накладные расходы на обслуживание (Отказ от ответственности: я работаю на Pusher , который предлагает такую ​​услугу) .No - self hosted или TCPServer / Client.
  • Насколько важна скорость? Если это действительно , то TCP-соединение без каких-либо издержек будет самым быстрым вариантом.,Вторыми лучшими вариантами будут WebSockets, затем HTTP Streaming и HTTP Long-Polling.

Примечание. Хотя я и говорю, что TCPServer / Client может быть самым простым подходом, который я хотел быподчеркните, что это также может не быть.WebSockets - это действительно захватывающая технология, которая во многих отношениях более доступна, чем технология TCPClient, поэтому она может стать доминирующей технологией для двунаправленной связи между любым сервером и клиентом *

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

3 голосов
/ 23 мая 2012

Я также оценивал легкий, но простой способ сообщать о событиях клиентам WPF с помощью службы pub / sub. Я не требовал гарантированной доставки сообщений, поэтому такие решения, как MassTransit или NServiceBus, казались слишком тяжелыми, поскольку они требуют наличия очередей (MSMQ или иным образом). У меня также было требование, чтобы решение было доступно как .NET 4.0 Профиль клиента .

Одно решение, построенное на WCF, которое, кажется, работает: nvents . Я не уверен, что этот проект все еще активен. Он прост в использовании, и базовая реализация (WCF) хорошо абстрагирована. Никаких неприятных настроек не требуется.

Другое решение, с которым я столкнулся в блоге Per Brage 1010 *, использует SignalR с Reactive Extensions. Я не пробовал его реализацию и не уверен, что для этого требуется полный профиль, но это хорошее чтение!

3 голосов
/ 15 декабря 2011

Вы должны посмотреть на WebSync от Frozen Mountain. Я использовал это в прошлом с отличными результатами. Это все, что вам нужно. Они даже предлагают размещенный сервис «WebSync on Demand». Они также предлагают бесплатный продукт (но до 10 одновременных пользователей). Это коммерческий продукт. Если вы не хотите выполнять всю работу по сантехнике, WebSync предлагает вам готовые API, которые вы можете просто начать использовать и быстро приступить к работе. Я слышал / читал о SignalR, еще не использовал его, но SignalR, похоже, находится в стадии альфа / бета, тогда как WebSync очень зрелый.

0 голосов
/ 15 декабря 2011

Вы можете создать службу wcf, в которой клиенты wpf регистрируют себя при запуске. Затем каждый wpf может связаться с сервером msmq или rabbitmq, где он будет опрашивать свою собственную очередь, созданную на основе имени клиента / уникального идентификатора. На стороне сервера у вас может быть служба, которая будет отправлять данные в очереди, поскольку данные доступны в зависимости от условий, установленных для каждого клиента.

0 голосов
/ 15 декабря 2011

Этот вопрос интересный.

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

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

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

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

...