Как получить контекст концентратора 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>();

Надеюсь, это поможет!