Как получить контекст концентратора SignalR в ASP.NET ядро?
Я пытаюсь получить контекст для концентратора, используя следующие кнопки:
var hubContext = GlobalHost.ConnectionManager.GetHubContext<SomeHub>();
проблема в том, что GlobalHost не определен. Я вижу, это часть сигнала.Ядро dll. На данный момент в моем проекте есть следующее .файл 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 не может быть найден. Если я удаляю сервер, а просто ядро пользователя версии 2.1.2, то GlobalHost работает, но все остальное, что нужно серверу, очевидно, нет.
какие идеи?
4 ответов
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>();
}
.....
IConnectionManager больше не существует в помощью SignalR для ASP.Net ядро.
Я использовал 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
Я добавил код в свой запуск.cs, чтобы захватить ссылку на ConnectionManager, который вы можете использовать для выполнения GetHubContext в любое время из любой точки вашего кода. Похожий на ответ Нимо, но немного другой, может быть, проще.
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>();
мне нужно было иметь доступ к контексту концентратора извне потока запроса приложения-потому что я подписывался на сообщения 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>();
надеюсь, что это помогает!