SignalR - отправка сообщения из проекта WCF

Я выполнил инструкции https://github.com/SignalR/SignalR/wiki/Hubs под названием «Вещание через концентратор извне».

Я получил этот метод, работающий внутри действия MVC в том же проекте. Запрос действия отправляет обновление подключенным клиентам.

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

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

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


person reach4thelasers    schedule 04.04.2012    source источник
comment
Проекты не выполняются: ваш вопрос лучше сформулировать в терминах приложений, служб NT или веб-приложений.   -  person Ian Mercer    schedule 04.04.2012
comment
Извините, я не совсем понимаю, что вы имеете в виду!   -  person reach4thelasers    schedule 04.04.2012
comment
Вы не можете выполнить проект Visual Studio - службы NT, консольные приложения, веб-приложения, узлы модульных тестов ... это то, что выполняется. Когда вы говорите "отправлять обновления из другого проекта", что вы имеете в виду? Проект, скомпилированный в сборку, выполняется в том же процессе? или отдельный исполняемый файл?   -  person Ian Mercer    schedule 04.04.2012


Ответы (2)


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

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

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

Например, вот как я настроил сложное решение Service + WebSite + Clients (пока не обращайте внимания на фиолетовый цвет):

Сложная архитектура SignalR

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

person Ian Mercer    schedule 04.04.2012

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

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

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

person Hasan    schedule 12.08.2013