如何在ASP.NET核心中获取SignalR Hub上下文?

34 signalr signalr-hub asp.net-core

我正在尝试使用以下内容获取集线器的上下文:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<SomeHub>();
Run Code Online (Sandbox Code Playgroud)

问题是没有定义GlobalHost.我看到它是SignalR.Core dll的一部分.目前,我在项目.json文件中,在依赖项下有以下内容:

"Microsoft.AspNet.SignalR.Server": "3.0.0-*"
Run Code Online (Sandbox Code Playgroud)

如果我添加最新的Core版本:

"Microsoft.AspNet.SignalR.Server": "3.0.0-*",
"Microsoft.AspNet.SignalR.Core" :  "2.1.2"
Run Code Online (Sandbox Code Playgroud)

我得到了一大堆错误,因为服务器和核心是冲突的.如果我将它们更改为使用版本"3.0.0-*",则所有冲突都会消失,但无法找到GlobalHost.如果我删除服务器,只删除用户核心版本2.1.2然后GlobalHost工作,但所有其他需要服务器的东西,显然不会.

有任何想法吗?

Sor*_*ren 80

SignalR for ASP.Net Core 中不再存在IConnectionManager.
我一直在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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用.net core 2.0.0和SignalR 1.0.0-alpha1-final

  • @AndrewNikolin,不需要注册`HubContext`.只需在`Configure`方法中介绍您的Hub.`app.UseSignalR(routes => {routes.MapHub <LiveHub>("live");});`我认为`services.AddSignalR();`HubContext将自动注册... (5认同)
  • 只要有IServiceProvider可用,就可以访问@lenniep`HubContext`。通过一些技巧,您可以在静态类中获得对[IServiceProvider]的[访问](https://github.com/aspnet/DependencyInjection/issues/294#issuecomment-142206554),但完全不建议这样做。 (2认同)
  • 对于.net 5,await _hubContext.Clients.All.SendAsync("yourmethod", yourparameters); (2认同)

Kir*_*lla 21

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>();
     }
 .....
Run Code Online (Sandbox Code Playgroud)

  • 这曾经在RC1中工作但在RC2中不起作用(我得到错误) - 你知道如何解决它吗? (4认同)

Ren*_*Str 7

要在后台服务中使用集线器,除了控制器之外,您还必须使用 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()
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以从 HubContext 静态字段的代码中的任何位置调用您的集线器:

MyBackgroundService.HubContext.Clients.All.SendAsync("UpdateData", myData).Wait();
Run Code Online (Sandbox Code Playgroud)

了解有关 IHostedService 的更多信息:https ://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services ? view = aspnetcore-2.1

您可以在 MyBackgroundService 中创建和启动计时器,并在 ElapsedEvent 中调用集线器。