51

如何从控制器的操作中调用集线器方法?这样做的正确方法是什么?

有人在帖子中使用了这个:

DefaultHubManager hd = new DefaultHubManager(GlobalHost.DependencyResolver);
var hub = hd.ResolveHub("AdminHub") as AdminHub;
hub.SendMessage("woohoo");

但对我来说,这是抛出:

不支持使用不是由 HubPipeline 创建的 Hub 实例。

我还读到您可以创建一个集线器上下文,但我不想对动作负责,也就是说,动作执行如下操作:

hubContext.Client(...).someJsMethod(..)
4

2 回答 2

112

正确的方法是实际创建集线器上下文。如何以及在何处执行此操作取决于您,这里有两种方法:

  1. 在您的集线器中创建一个静态方法(不必在您的集线器中,实际上可以在任何地方),然后您可以通过调用它AdminHub.SendMessage("wooo")

    public static void SendMessage(string msg)
    {
        var hubContext = GlobalHost.ConnectionManager.GetHubContext<AdminHub>();
        hubContext.Clients.All.foo(msg);
    }
    
  2. 完全避免使用静态方法,直接发送到集线器客户端

        var hubContext = GlobalHost.ConnectionManager.GetHubContext<AdminHub>();
        hubContext.Clients.All.foo(msg);
    
于 2013-07-01T02:33:36.663 回答
3

按照aspnet3.1

这与使用 GlobalHost 提供对 IHubContext 的访问的 ASP.NET 4.x SignalR 不同。ASP.NET Core 有一个依赖注入框架,它消除了对这个全局单例的需要。

目前建议的方法是依赖注入。您可以在此处阅读更多相关信息。

https://docs.microsoft.com/en-us/aspnet/core/signalr/hubcontext?view=aspnetcore-3.1


上面的片段

public class HomeController : Controller
{
    private readonly IHubContext<NotificationHub> _hubContext;

    public HomeController(IHubContext<NotificationHub> hubContext)
    {
        _hubContext = hubContext;
    }
}

然后像这样称呼它

public async Task<IActionResult> Index()
{
    await _hubContext.Clients.All.SendAsync("Notify", $"Home page loaded at: {DateTime.Now}");
    return View();
}
于 2020-05-04T16:38:20.187 回答