Вызов клиентов-концентраторов SignalR из других систем
Я установил концентратор SignalR для связи между сервером и клиентом. Код на стороне сервера-концентратора хранится в классе Hooking.cs. Я хочу, чтобы вы могли вызвать метод, определенный в Hooking.cs, чтобы я мог передавать сообщения любым подключенным клиентам из любого места в моем приложении. Кажется, что для каждого вызова клиент/сервер создается новый экземпляр Hooking.cs, поэтому я надеялся, что смогу использовать что-то вроде
var hooking = new Hooking();
hooking.Test();
с помощью метода Test(), определенного в Hooking.cs, таких как
public static void Test() {
Clients.test()
}
и с javascript на стороне клиента
var hooking = $.connection.hooking;
hooking.test = function() { alert("test worked"); };
$.connection.hub.start()
К сожалению, это не так просто, поскольку клиенты не являются статическими, поэтому недоступны из статического метода.
Просматривая исходный код SignalR, я столкнулся с методом, который выглядел многообещающим, Hubs.Invoke(string hubName, string method, params object[] args)
, поэтому я надеюсь, что смогу использовать что-то вроде Hubs.Invoke("Hooking", "Test")
, но я не могу заставить его работать.
Любая помощь с этим была бы чрезвычайно оценена
Ответы
Ответ 1
Это правильный способ для SignalR 2.x:
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.addMessage(message);
В принципе, вы можете использовать средство определения зависимостей для текущего хоста для разрешения интерфейса IConnectionManager
, который позволяет вам получить объект контекста для концентратора.
Дополнительную информацию можно найти в официальной документации .
Ответ 2
Hub.GetClients исчез в версии 0.4.0.
В wiki вы можете использовать:
IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = connectionManager.GetClients<MyHub>();
Ответ 3
Вы можете легко использовать концентратор , выполнив этот 2 шаг -
-
Инициирование путем инъекции зависимостей, как это -
public class ClassName
{
........
........
private IHubContext _hub;
public BulletinSenderController(IConnectionManager connectionManager)
{
_hub = connectionManager.GetHubContext<McpHub>();
........
........
}
............
............
}
2. Используя объект hub
, подобный этому -
_hub.Clients.All.onBulletinSent(bulletinToSend);
Подробнее можно найти здесь.
Пример кода можно найти в этом git репо.
Ответ 4
Посмотрите, как это делается в Chat.cs
в SignalR.Samples.Hubs.Chat
из https://github.com/SignalR/SignalR.
Я вижу там, что статические Dictionary<TKey, TValue>
создаются сверху, поэтому я думаю, что они постоянно сохраняются, либо с классом Chat
, являющимся постоянным экземпляром (?), либо тем, что этот массив каким-то образом обновляется.
Проверьте это, Дэвид Фоулер, вероятно, будет лучшим на этом.
Ответ 5
Это изменилось в .NET Core 2, теперь вы можете использовать внедрение зависимостей следующим образом:
private readonly IHubContext<MyHub,IMyHubInterface> _hubContext;
public MyController(MyHub,IMyHubInterface hubContext)
{
_hubContext = hubContext;
}
public bool SendViaSignalR()
{
_hubContext.Clients.All.MyClientSideSignalRMethod(new MyModel());
return true;
}