从控制器的操作中调用hub方法

时间:2013-06-30 21:52:26

标签: asp.net-mvc asp.net-mvc-4 signalr signalr-hub

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

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

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

但对我来说,这就是投掷:

  

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

我还读到你可以创建一个集线器上下文,但是我不想对这个动作负责,也就是说,行动做的事情如下:

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

2 个答案:

答案 0 :(得分:95)

正确的方法是实际创建集线器上下文。你如何以及在哪里做到这一点取决于你,这里有两种方法:

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

答案 1 :(得分:3)

按照aspnet3.1

这不同于ASP.NET 4.x SignalR,后者使用GlobalHost提供对IHubContext的访问。 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();
}