Как получить контекст концентратора SignalR в ядре ASP.NET?
Я пытаюсь получить контекст для концентратора, используя следующее:
var hubContext = GlobalHost.ConnectionManager.GetHubContext<SomeHub>();
Проблема в том, что GlobalHost не определен. Я вижу, что это часть DLL SignalR.Core. На данный момент в моем проекте .json файл в зависимостях:
"Microsoft.AspNet.SignalR.Server": "3.0.0-*"
Если я добавлю последнюю версию Core:
"Microsoft.AspNet.SignalR.Server": "3.0.0-*",
"Microsoft.AspNet.SignalR.Core" : "2.1.2"
Я получаю целую кучу ошибок, потому что сервер и ядро конфликтуют. Если я изменю их на обе версии версии "3.0.0- *", все конфликты исчезнут, но GlobalHost не будет найден. Если я удалю сервер и просто пользовательскую версию Core 2.1.2, то GlobalHost будет работать, но все, что нужно для Сервера, очевидно, не делают.
Любые идеи?
Ответы
Ответ 1
Microsoft.AspNet.SignalR.Infrastructure.IConnectionManager
- это сервис с внедрением DI, с помощью которого вы можете получить контекст концентратора... Например:
using Microsoft.AspNet.SignalR;
using Microsoft.AspNet.SignalR.Infrastructure;
using Microsoft.AspNet.Mvc;
public class TestController : Controller
{
private IHubContext testHub;
public TestController(IConnectionManager connectionManager)
{
testHub = connectionManager.GetHubContext<TestHub>();
}
.....
Ответ 2
IConnectionManager больше не выходит в SignalR для ASP.Net Core.
Я использовал HubContext
для доступа к концентратору.
public class HomeController : Controller
{
private readonly IHubContext<LiveHub> _hubContext;
public HomeController(IHubContext<LiveHub> hubContext)
{
_hubContext = hubContext;
}
public void SendToAll(string message)
{
_hubContext.Clients.All.InvokeAsync("Send", message);
}
}
Я использую .net core 2.0.0 и SignalR 1.0.0-alpha1-final
Ответ 3
Я добавил код в свой Startup.cs, чтобы получить ссылку на ConnectionManager, который затем можно использовать для создания GetHubContext в любое время из любого места в вашем коде. Подобно Nimo, но немного отличается, может быть, проще.
services.AddSignalR(options =>
{
options.Hubs.EnableDetailedErrors = true;
});
var provider = services.BuildServiceProvider();
//Hold on to the reference to the connectionManager
var connManager = provider.GetService(typeof(IConnectionManager)) as IConnectionManager;
//Use it somewhere else
var hub = connManager.GetHubContext<SignalHub>();
Ответ 4
Мне нужно было иметь доступ к контексту концентратора извне потока запросов приложения - потому что я подписывался на сообщения NServicebus, и мне нужно было иметь возможность запускать функцию клиента при получении сообщения.
Вот как я это разобрал:
public static IServiceProvider __serviceProvider;
затем при запуске конфигурации
app.UseServices(services =>
{
__serviceProvider = new ServiceCollection()
.BuildServiceProvider(CallContextServiceLocator.Locator.ServiceProvider);
});
Затем в любом другом месте приложения vNext asp.net (любой другой поток)
var manager = Startup.__serviceProvider.GetRequiredService<IConnectionManager>();
var hub = manager.GetHubContext<ChatHub>();
Надеюсь, это поможет!