Отправить сообщение 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);
  }