从MVC控制器添加SignalR Hub组

时间:2015-01-22 03:39:17

标签: c# asp.net-mvc signalr signalr-hub

我有一个带有非静态方法的SignalR Hub,它会根据以表格形式输入的电子邮件地址创建一个新组:

public class EmailHub : Hub
{
    public void AddEmail(string email)
    {
        base.Groups.Add(base.Context.ConnectionId, email);
    }
}

我想从我的MVC控制器中调用此Hub方法。我的方法目前看起来像这样:

public class MyController : Controller
{
    public ActionResult AddEmail(string email)
    {
        var hub = GlobalHost.ConnectionManager.GetHubContext<EmailHub>();
        hub.Clients.All.AddEmail(email);

        return View();
    }
}

但是,控制器中的代码不会调用hub方法。我可以更改什么才能成功调用hub方法?

1 个答案:

答案 0 :(得分:3)

您必须将ConnectionId作为参数传递,并且在SignalR已经连接之前您无法获得该信息。

SignalR连接仅适用于客户端上的一个“页面视图”。换句话说,如果我转到/chat/rooms/1,我会收到ConnectionId,如果我导航到/chat/rooms/2,我会得到不同的 ConnectionId 。因此,当您尝试在此处使用时,base.Context.ConnectionId基本上不存在。

这给你留下了两个选择。

  1. 在SignalR连接每页后订阅更新。在这种情况下,您要提交一个典型的AddEmail请求,然后在加载View()之后在JavaScript中加载SignalR,connect,然后提交hub.server.addEmail(email)。这是SignalR的标准方法。

  2. 这基本上是一回事,但是如果您使用SPA框架来让您在视图之间保持SignalR连接,那就可以了。当然,这是一个非常重大的变化。

  3. 我假设您的操作AddEmail实际上是一个页面,而我从中推断出它返回ViewResult,我的所有这些都是基于此。如果用AJAX调用它,你可以将ConnectionId作为查询参数附加,所有这些都没有实际意义。