Hvordan komme SignalR Hub kontekst i en ASP.NET kjerne?

stemmer
18

Jeg prøver å få sammenheng for en hub ved hjelp av følgende:

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

Problemet er at GlobalHost ikke er definert. Jeg ser det er en del av SignalR.Core dll. For øyeblikket har jeg følgende i prosjektet mitt .json fil under avhengigheter:

Microsoft.AspNet.SignalR.Server: 3.0.0-*

Hvis jeg legger den nyeste tilgjengelige versjonen av kjernen:

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

Jeg får en hel haug med feil fordi serveren og kjernen er i konflikt. Hvis jeg endre dem til både bruk versjon 3.0.0- *, alle konfliktene gå bort, men GlobalHost kan ikke funnet. Hvis jeg fjerner Server, og bare bruker Core-versjon 2.1.2 så GlobalHost fungerer, men alle de andre tingene trenger Server, selvsagt ikke.

Noen ideer?

Publisert på 04/12/2014 klokken 16:40
kilden bruker
På andre språk...                            


5 svar

stemmer
41

IConnectionManager eksisterer ikke noe mer i SignalR for ASP.Net Core.
Jeg har brukt HubContextfor å få tilgang til en hub.

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

Jeg bruker .net kjernen 2.0.0 og SignalR 1.0.0-alpha1-finalen

Svarte 20/09/2017 kl. 10:06
kilden bruker

stemmer
14

Microsoft.AspNet.SignalR.Infrastructure.IConnectionManager er en DI injisert tjeneste der du kan få navet sammenheng ... For eksempel:

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>();
     }
 .....
Svarte 04/12/2014 kl. 19:30
kilden bruker

stemmer
2

Jeg har lagt noen kode til mine Startup.cs å hente referanse til ConnectionManager som du så kan bruke til å gjøre en GetHubContext når som helst fra hvor som helst i koden. I likhet med Nimo svar, men litt annerledes, kanskje enklere.

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>();
Svarte 12/06/2016 kl. 16:24
kilden bruker

stemmer
1

For å bruke navet i en backgroud service, i tillegg til å kontrollere, må du bruke IHostedService grensesnitt og få navet av DI.

public class MyBackgroundService : IHostedService, IDisposable
{
    public static IHubContext<NotifierHub> HubContext;

    public MyBackgroundService(IHubContext<NotifierHub> hubContext)
    {
        HubContext = hubContext;
    }

    public Task StartAsync(CancellationToken cancellationToken)
    {
        //TODO: your start logic, some timers, singletons, etc
        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken)
    {
        //TODO: your stop logic
        return Task.CompletedTask;
    }

    public void Dispose()
    {
    }
}

Deretter kan du ringe din hub fra hvor som helst i koden fra HubContext statisk felt:

MyBackgroundService.HubContext.Clients.All.SendAsync("UpdateData", myData).Wait();

Lær mer om IHostedService: https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-2.1

Du kan opprette og starte en tidtaker i MyBackgroundService og ringe navet i ElapsedEvent.

Svarte 16/10/2018 kl. 01:08
kilden bruker

stemmer
1

Jeg trengte å være i stand til å få tilgang til Hub kontekst fra utsiden app forespørselen tråd - for jeg ble abonnere på NServicebus meldinger, og for å være i stand til å utløse en klientfunksjon da jeg har mottatt en melding.

Her er hvordan jeg har det sortert:

public static IServiceProvider __serviceProvider;

deretter under oppstart konfigurasjon

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

Så noe annet sted i vNext asp.net søknad (noen annen tråd)

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

Håper dette hjelper!

Svarte 05/12/2014 kl. 06:27
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more