Comment obtenir SignalR Hub Context dans un ASP.NET noyau?

j'essaie d'obtenir le contexte d'un hub en utilisant ce qui suit:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<SomeHub>();

le problème est que GlobalHost n'est pas défini. Je vois que c'est une partie de la SignalR.Core dll. En ce moment, j'ai ce qui suit dans mon projet .fichier json, sous dépendances:

"Microsoft.AspNet.SignalR.Server": "3.0.0-*"

Si j'ajoute la dernière version disponible de Base:

"Microsoft.AspNet.SignalR.Server": "3.0.0-*",
"Microsoft.AspNet.SignalR.Core" :  "2.1.2"

j'ai tout un tas d'erreurs parce que le serveur et le noyau sont en conflit. Si je les change pour utiliser la version " 3.0.0 -*", tous les les conflits disparaissent, mais GlobalHost est introuvable. Si je supprime Server, et juste user Core version 2.1.2 alors GlobalHost fonctionne, mais toutes les autres choses qui ont besoin de Server, évidemment pas.

des idées?

21
demandé sur Soren 2014-12-04 19:40:37

4 réponses

Microsoft.AspNet.SignalR.Infrastructure.IConnectionManager est un service di injecté par lequel vous pouvez obtenir le contexte hub...Par exemple:

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>();
     }
 .....
14
répondu Kiran Challa 2014-12-05 00:32:29

IConnectionManager n'existe plus dans SignalR pour ASP.Net noyau.

J'ai été en utilisant HubContext pour accéder à un concentrateur.

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);
    }
}

j'utilise .net core 2.0.0 et SignalR 1.0.0-alpha1-final

48
répondu Soren 2018-04-03 05:38:14

j'ai ajouté du code à mon démarrage.cs pour saisir la référence au gestionnaire de connexion que vous pouvez ensuite utiliser pour faire un GetHubContext à tout moment à partir de n'importe où dans votre code. Semblable à la réponse DE Nimo mais un peu différent, peut-être plus simple.

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>();
2
répondu Matt Watson 2016-06-12 16:38:28

j'avais besoin de pouvoir accéder au contexte Hub depuis l'extérieur du thread de requête app - parce que je m'abonnais aux messages NServicebus, et que j'avais besoin d'être capable de déclencher une fonction client lorsque je recevais un message.

Voici comment je l'ai eu, triés:

public static IServiceProvider __serviceProvider;

puis lors du démarrage de la configuration

app.UseServices(services =>
        {
            __serviceProvider = new ServiceCollection()
            .BuildServiceProvider(CallContextServiceLocator.Locator.ServiceProvider);
        });

Puis partout ailleurs dans le vNext asp.net application (n'importe quel autre thread)

 var manager = Startup.__serviceProvider.GetRequiredService<IConnectionManager>();
            var hub = manager.GetHubContext<ChatHub>();

Espérons que cette aide!

1
répondu nimo 2014-12-05 06:27:32