Это может быть сделано довольно легко с WCF и дуплексными контрактами .Вы можете определить операции, которые клиент может выполнять на сервере (как любой веб-сервис), и, кроме того, вы можете определить операции, которые сервер может выполнять на клиенте (т.е. обратный веб-сервис).Код мудрый, они оба просто вызовы методов.У клиента есть методы, которые вызывают операции на сервере, и он также должен предоставить объект, реализующий контракт обратного вызова, который является интерфейсом, который может вызывать сервер, и клиент должен предоставить реализацию.Все сериализации / десериализации данных и сообщений, а также все сетевые операции низкого уровня обрабатываются WCF, поэтому вам не придется об этом беспокоиться.
WCF поддерживает дуплексные контракты с использованием двух привязок (или «протоколов»):
WSDualHttpBinding - Это влечет за собой двух прослушивателей HTTP на основе SOAP, одного на сервере и одного на клиенте.Когда клиент хочет связаться с сервером, он выполняет HTTP-запрос к серверу.Когда сервер хочет связаться с клиентом, он выполняет HTTP-запрос к клиенту.Преимущество этого подхода состоит в том, что любое сетевое соединение является мимолетным и не остается открытым (как в большинстве HTTP-соединений), и поэтому оно может поддерживать большое количество или одновременных клиентов.Основным недостатком является то, что он, вероятно, не будет работать с большинством клиентских компьютеров через Интернет, поскольку они обычно находятся за NAT (не проблема для межсерверных коммуникаций через Интернет или любого вида связи внутри интрасети или локальной сети).,Для получения дополнительной информации см. Мой другой ответ .
NetTcpBinding - это в основном открывает сокет от клиента к серверу и сохраняет его открытымна время сеанса.Это позволяет осуществлять двустороннюю связь даже через NAT, но поскольку соединения должны оставаться открытыми, это несколько увеличивает нагрузку на сервер и, следовательно, сможет поддерживать менее параллельных пользователей (но, вероятно, в большинстве случаев их будет более чем достаточно).Это мой предпочтительный способ выполнения дуплексных контрактов в WCF, поскольку его легче начать работать и он более надежен.
Преимущество WCF заключается в том, что вы можете переключаться между двумя привязками, не меняякод.Все, что требуется, - это изменить конфигурацию (файл .config).
Какой бы способ вы ни выбрали, вы сможете осуществлять почти мгновенную связь в обоих направлениях (конечно, с учетом задержки в сети).Я не вижу необходимости в SignalR, когда в вашем распоряжении есть такая мощная, мощная и простая в использовании инфраструктура, как WCF.Если вы ограничены работой в браузере, тогда SignalR будет иметь смысл.Поскольку вы работаете в .NET, это может привести к ненужным трениям.