Отправить сигнальное сообщение с сервера всем клиентам

Это связано с SignalR + отправкой сообщения на концентратор через метод действия, но мой вопрос немного другой:

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

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");

Это нормально, но я хочу вызвать метод на своем концентраторе.


person Matt Roberts    schedule 13.07.2012    source источник
comment
Теперь это возможно и в ASP.NET Core (хотя сам SignalR в настоящее время все еще находится в альфа-версии). См. этот подробный ответ в основной версии этого вопроса.   -  person brichins    schedule 09.03.2017


Ответы (3)


Вы можете сделать это с помощью статического метода:

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!");

Хорошая статья о SignalR API: http://weblogs.asp.net/davidfowler/archive/2012/05/04/api-improvements-made-in-signalr-0-5.aspx

Предоставлено Паоло Моретти в комментариях

person Paul    schedule 13.07.2012
comment
AspNetHost.DependencyResolver исчез в SignalR 0.5+. См. здесь (Получение ссылки на соединение / концентратор за пределами соединения или концентратора) - person Paolo Moretti; 13.07.2012

У меня была такая же проблема, в моем примере 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);
  }
person formatc    schedule 13.07.2012
comment
Другой ответ отвечает на мой вопрос, но вы получаете +1, потому что, подумав, я не уверен, что мне нужно вызывать метод концентратора - например, вы говорите, что `` методы концентратора должны использоваться с клиента '' - person Matt Roberts; 14.07.2012
comment
+1 за указание, как использовать методы концентратора. Я собирался совершить ту же ошибку. исправил это после этого. - person emre nevayeshirazi; 10.01.2013
comment
@emrenevayeshirazi какая ошибка? - person sotn; 15.01.2017

Обновление для ASP.NET Core 2.x и 3.x:

Вы можете легко получить доступ к экземпляру Hub в любом месте, где есть внедрение зависимостей:

public class HomeController : Controller
{
    private readonly IHubContext<MyHub> _myHubContext;

    public HomeController(IHubContext<MyHub> myHubContext)
    {
        _myHubContext = myHubContext;
    }

    public void SendMessage(string msg)
    {
        _myHubContext.Clients.All.SendAsync("MessageFromServer", msg);
    }
}

Если это дает синтаксические ошибки, убедитесь, что у вас есть:

using Microsoft.AspNetCore.SignalR;

и что у вас НЕТ:

using Microsoft.AspNet.SignalR;
person Josh Withee    schedule 11.07.2020