web-dev-qa-db-ja.com

ASP.NET CoreでSignalRハブコンテキストを取得する方法は?

私は次を使用してハブのコンテキストを取得しようとしています:

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

問題は、GlobalHostが定義されていないことです。 SignalR.Core 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は機能しますが、サーバーを必要とする他のすべての機能は明らかに機能しません。

何か案は?

32
user2095880

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>();
     }
 .....
21
Kiran Challa

IConnectionManager は、ASP.Net CoreのSignalRにもう存在しません。
ハブへのアクセスに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を使用しています

78
Soren

ConnectionManagerへの参照を取得するためにStartup.csにコードを追加しました。これを使用して、コードのどこからでもいつでも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>();
2
Matt Watson

コントローラに加えて、バックグラウンドサービスでハブを使用するには、IHostedServiceインターフェイスを使用し、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()
    {
    }
}

次に、HubContext静的フィールドからコードのどこからでもハブを呼び出すことができます。

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

IHostedServiceの詳細: https://docs.Microsoft.com/en-us/aspnet/core/fundamentals/Host/hosted-services?view=aspnetcore-2.1

MyBackgroundServiceでタイマーを作成して開始し、ElapsedEventでハブを呼び出すことができます。

2
user1203003

アプリリクエストスレッドの外部からハブコンテキストにアクセスできる必要がありました-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>();

お役に立てれば!

1
nimo