Отправить сообщение signalr с сервера всем клиентам
Это связано с SignalR + отправка сообщения в концентратор с помощью метода действия, но мой вопрос немного другой:
Я на версии 0.5.2 signalr, используя концентраторы. В более старых версиях вам было предложено создать методы на концентраторе для отправки сообщений всем клиентам, что у меня есть:
public class MyHub : Hub
{
public void SendMessage(string message)
{
// Any other logic here
Clients.messageRecieved(message);
}
...
}
поэтому в 0.5.2 я хочу отправить сообщение всем клиентам (скажем, откуда-то из контроллера). Как я могу получить доступ к MyHub
экземпляра?
единственный способ, на который я видел ссылку, это:
var hubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
hubContext.Clients.messageRecieved("hello");
что нормально, но я хочу вызвать метод на моем концентраторе.
2 ответов
вы можете сделать это, используя статический метод:
SignalR V. 04 -
public class MyHub : Hub
{
internal static void SendMessage(string message)
{
var connectionManager = (IConnectionManager)AspNetHost.DependencyResolver.GetService(typeof(IConnectionManager));
dynamic allClients = connectionManager.GetClients<MyHub>();
allClients.messageRecieved(message);
}
...
}
SignalR 0.5+
public class MyHub : Hub
{
internal static void SendMessage(string message)
{
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.messageRecieved(message);
}
...
}
вы можете назвать это вот так:
MyHub.SendMessage("The Message!");
хорошая статья об API SignalR: http://weblogs.asp.net/davidfowler/archive/2012/05/04/api-improvements-made-in-signalr-0-5.aspx
предоставлено Паоло Моретти в комментариях
у меня была такая же проблема, в моем примере addNotification-это метод на стороне клиента:
var hubContext = GlobalHost.ConnectionManager.GetHubContext<SignalR.NotificationsHub>();
hubContext.Clients.addNotification("Text here");
на стороне клиента вы можете добавить код для вызова метода концентратора в addNotification:
var notification = $.connection.notificationHub;
notification.addNotification = function (message) {
notification.addServerNotification(message); // Server Side method
}
$.connection.hub.start();
хаб:
[HubName("notificationHub")]
public class NotificationsHub : Hub
{
public void addServerNotification(string message)
{
//do your thing
}
}
обновление: Перечитывая ваш вопрос снова и снова, я действительно не нахожу причин для этого. Методы концентратора обычно вызываются со стороны клиента, или я неправильно вас понял, во всяком случае, вот обновление. Если вы хотите сделать серверную сторону, а затем уведомлять клиентов.
[HttpPost]
[Authorize]
public ActionResult Add(Item item)
{
MyHubMethodCopy(item);
var hubContext = GlobalHost.ConnectionManager.GetHubContext<SignalR.NotificationsHub>();
hubContext.Clients.addNotification("Items were added");
}
private void MyHubMethodCopy(Item item)
{
itemService.AddItem(item);
}