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

надеюсь, что это помогает!