2012-04-04 1 views
2

Я следовал инструкциям от https://github.com/SignalR/SignalR/wiki/Hubs , озаглавленному «Передача через концентратор со стороны концентратора».SignalR - Отправка сообщения из проекта WCF

У меня этот метод работает из MVC Action в том же проекте. Запрос на действие отправляет обновление подключенным клиентам.

Моя проблема заключается в том, что мне нужно иметь возможность отправлять обновления из другого проекта, в частности проекта веб-служб WCF. Мое приложение имеет API и веб-компонент, и когда пользователи API делают вызовы, которые меняют ситуацию, эти обновления нужно выталкивать веб-клиентам через SignalR. И вызов веб-службы с тем же кодом, что и тестовое действие, не работает.

Я также пробовал один и тот же код в тесте unit nunit, который тоже не работал.

Что мне нужно сделать, чтобы сделать тот же самый метод, описанный в работе Wiki для проекта WCF?

+0

«Проекты» не выполняются: ваш вопрос будет лучше сформулирован с точки зрения приложений, служб NT или веб-приложений. –

+0

Извините, я не уверен, что вы имеете в виду! – reach4thelasers

+0

Вы не можете выполнить Visual Studio «Project» - службы NT, консольные приложения, веб-приложения, узлы тестирования модулей ... - это вещи, которые выполняются.Когда вы говорите «отправьте обновления из другого проекта *», что вы имеете в виду? Проект, скомпилированный для сборки, выполняющейся в том же процессе? или отдельный исполняемый файл? –

ответ

6

Простейшим решением является, возможно, предоставление API в вашем веб-приложении (с использованием MVC или нового WebAPI), который передает все подключенные клиенты. Любое другое приложение (служба NT, тест NUnit, ...) может вызывать этот API, если он хочет отправить сообщение клиентам.

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

Если вам требуется двусторонняя связь от вашего отдельного приложения к вашим клиентам, просто добавьте приложение в клиент SignalR и передайте его через веб-приложение, размещенное на SignalR, и попросите его также прослушать сообщения ,

Например, вот как я настроил комплексное обслуживание + WebSite + Клиенты решение (игнорировать фиолетовый сейчас):

SignalR Complex Architecture

Живой веб-сервер позволяет NT Services для подключения и создать SignalR группы , Службы NT отправляются этим группам. Веб-браузеры подключаются к группе и получают сообщения, отправляемые в эту группу. По сути, средний ящик становится pubsubhub.

2

Я не могу получить именно то, что вы прицеливаете. Но если я правильно понял, вы пытаетесь отправить какие-то уведомления, сделанные внутри служб WCF, клиентам SignalR. Если это так; Я могу предложить вам мой подход:

У меня есть некоторые службы WCF и концентратор SignalR на том же сервере приложений. IMHO, лучший способ сообщить WCF с концентратором SignalR - это использовать MSMQ. Когда уведомление появляется внутри службы WCF, он помещает служебную информацию уведомления в MSMQ. С другой стороны, концентратор SignalR прослушивает одну и ту же очередь. Когда сообщение помещается в очередь, оно получает контент и передает его клиентам-концентраторам. Очень легко и просто. Никакого дополнительного вызова службы/концентратора на стороне сервера.

Контактор SignalR может прослушивать новые элементы очереди с помощью метода System.Messaging.MessageQueue#ReceiveCompleted. Когда это событие возникает, концентратор SignalR получает элемент очереди и передает его своим клиентам.