私は次を使用してハブのコンテキストを取得しようとしています:
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は機能しますが、サーバーを必要とする他のすべての機能は明らかに機能しません。
何か案は?
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 は、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を使用しています
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>();
コントローラに加えて、バックグラウンドサービスでハブを使用するには、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でハブを呼び出すことができます。
アプリリクエストスレッドの外部からハブコンテキストにアクセスできる必要がありました-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>();
お役に立てれば!