2015-05-29 1 views
2

У меня есть сайт ASP.NET, который использует концентраторы SignalR для отправки сообщений пользователям сайта.Отправка трансляций SignalR, выполняемых в приложении ASP.NET MVC из службы Windows на том же сервере

У меня есть код, который вызывает концентраторы в моем бизнес-слое, и я использую инъекцию зависимостей, чтобы вставлять экземпляры концентраторов из моего приложения ASP.NET на мой бизнес-уровень.

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

Можно ли «подключить» к моим существующим концентраторам SignalR с сервера, которые работают в моем приложении ASP.NET и отправлять широковещательные передачи из моей службы Windows?

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

// This code enables a client connection 
var connection = new HubConnection("http://localhost:3537/"); 
IHubProxy myHub = connection.CreateHubProxy("NotificationHub"); 

connection.Start().Wait(); 

myHub.Invoke("setNotificationCount", "5"); 
+0

Является ли код указанным вами подключением в качестве клиента или попыткой трансляции с сервера? – Pseudonym

+0

Указанный код подключается как клиент из приложения C#. Я хотел бы подключиться, но чтобы иметь возможность транслировать с сервера из службы Windows, которая работает на том же сервере. – Luke

+0

А, это немного сложнее, чем я себе представлял, хм, я отправил ответ, но я не уверен, насколько он будет полезен ... все еще смотрится, хотя – Pseudonym

ответ

1

концентраторов размещены в ASP.NET заявление. Так нет, нет никакого способа, вы можете транслировать прямо из окна службы ... без использования scaleout особенности SignalR ...

Решения 1 (без использования scaleout - предпочтительно):

службы Windows, подключается к хаб, запущенный внутри приложения APS.NET (hub1) в качестве клиента, и вызывает специальный метод хаба, который передает сообщения всем клиентам. OFC таким методом могут злоупотреблять обычные (браузерные) клиенты. Чтобы устранить это, вы можете создать еще один концентратор (hub2) в приложении ASP.NET, поместите здесь этот метод и используйте GlobalHost.ConnectionManager.GetHubContext<hub1>() для трансляции всех клиентов, подключенных к hub1. Hub2 может быть защищен by authorization, поэтому его может использовать только служба Windows. Поскольку вы уже используете контейнер DI и внедряете концентраторы в свою бизнес-логику, вам должно быть легко определить общий интерфейс (INotificationService) и создать две разные реализации - сначала будет использоваться внутри приложения ASP.NET (используя Hub1 для фактического уведомления) , второй будет использоваться внутри Windows Service и использовать Hub2 для передачи уведомления в приложение ASP.NET. С точки зрения BL, это то же самое ...

OFC for Win Service -> Связь ASP.NET, вы можете использовать любые другие коммуникационные технологии, такие как MVC или WebAPI (как предлагалось @Pseudonym), а не только SignalR

решение 2

Если это не подходит для вас по какой-то причине, есть еще одна идея. думаю SignalR scaleout feature бывает (mis) б/у здесь. Просто разместите свой hub1 и внутри ASP.NET и Служба Windows (с разными URL-адресами и портами!). Даже если клиенты будут подключаться напрямую только к приложению ASP.NET, код, запущенный внутри Windows Service, все равно сможет передавать сообщения им (сообщения передаются в шину сообщений масштабирования, затем в приложение ASP.NET, а затем - клиентам).

С помощью масштабирования (требуется SQL Server \ Redis или любая другая плата SignalR + latency и т. Д. И т. Д.), И вы, вероятно, захотите заблокировать концентраторы служб Windows, чтобы клиенты не могли напрямую подключиться к нему и запустить методы hub1 (i «Не знаю, как это сделать - одна идея - использовать другую реализацию хаба, но с тем же именем (HubNameAttribute) и пустые методы + авторизация, чтобы к ней никто не мог подключиться). В любом случае, это больше неприятностей, и у вас не должно быть повода для этого маршрута ...

+0

Спасибо за это, я собираюсь подключиться к концентратору SignalrR или использовать WebAPI. Я думаю, что с базой безопасности там. – Luke

1

EDIT: Так на основе нашего обсуждения здесь мое понимание проблемы:

проблема: Существует существующий проект, который может получить доступ к клиентам SignalR и этот про ject должен отвечать на событие службы Windows, работающее на том же сервере, что и проект с этими клиентами.

Мое решение: Я бы пристроить или сделать использование проекта WebAPI выступать в качестве пути между для обслуживания и серверного проекта. Служба может вызывать методы webAPI, которые, в свою очередь, обращаются к вашей логике бизнес-уровня и затем при необходимости обновляют клиенты SignalR. Это также имеет преимущество, заключающееся в том, что встроенные средства защиты, предлагаемые Microsoft, доступны для использования (например, любая схема аутентификации: формы, окна и т. Д.).


Путь this учебник объясняет это, что для того, чтобы транслировать клиентам, в первую очередь необходимо получить ссылки на все подключенных клиентов.

GlobalHost.ConnectionManager.GetHubContext<StockTickerHub>().Clients) есть пример того, как вернуть список клиентов

оттуда вам нужно сделать что-то вроде (опять же, чтобы использовать их пример): Clients.All.SomeClientMethod(string aParameter)

+0

Спасибо, что нашли время ответить. Это возможно из приложения ASP.NET, но, к сожалению, не из другого проекта, такого как сервер Windows. – Luke

+0

Да, я видел ваш комментарий, я смотрю на него – Pseudonym