我有一个带有非静态方法的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方法?
答案 0 :(得分:3)
您必须将ConnectionId
作为参数传递,并且在SignalR已经连接之前您无法获得该信息。
SignalR连接仅适用于客户端上的一个“页面视图”。换句话说,如果我转到/chat/rooms/1
,我会收到ConnectionId
,如果我导航到/chat/rooms/2
,我会得到不同的 ConnectionId
。因此,当您尝试在此处使用时,base.Context.ConnectionId
基本上不存在。
这给你留下了两个选择。
在SignalR连接每页后订阅更新。在这种情况下,您要提交一个典型的AddEmail
请求,然后在加载View()
之后在JavaScript中加载SignalR,connect,然后提交hub.server.addEmail(email)
。这是SignalR的标准方法。
这基本上是一回事,但是如果您使用SPA框架来让您在视图之间保持SignalR连接,那就可以了。当然,这是一个非常重大的变化。
我假设您的操作AddEmail
实际上是一个页面,而我从中推断出它返回ViewResult
,我的所有这些都是基于此。如果用AJAX调用它,你可以将ConnectionId
作为查询参数附加,所有这些都没有实际意义。