【问题标题】:SignalR: Using the caller method outside of the hub contextSignalR:在集线器上下文之外使用调用者方法
【发布时间】:2017-09-12 13:47:35
【问题描述】:
我正在尝试在 Hub 上下文之外使用 Caller 方法。我有一个助手类,在向所有用户广播消息时可以正常工作:
hub.Clients.All.newLessonAlert(notif);
它不允许我在此类中使用 Caller 方法,但这在集线器上下文类中可以正常工作。为什么是这样?我还尝试将我的所有函数移到上下文类中,但现在我得到了这个未经处理的异常:
不支持使用不是由 HubPipeline 创建的 Hub 实例
是否有一种直接的方法可以继续使用我的帮助程序类并识别与集线器的连接?
【问题讨论】:
标签:
asp.net
asp.net-mvc
signalr
signalr-hub
【解决方案1】:
我通过以下方式解决了这个问题:
-
我在 Hub 类中创建了一个 OnConnected 方法。这将当前连接的用户分配到一个组。
[HubName("NotificationsHub")]
public class NotificationHub : Hub
{
private static IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext<NotificationHub>();
public override Task OnConnected()
{
string userid = Context.Request.User.Identity.GetUserId();
Groups.Add(Context.ConnectionId, userid);
return base.OnConnected();
}
}
-
修改了我的 HubHelper 类,现在将这个警报广播给当前连接的用户(由用户 ID 指定)
public void HighScoreAlert(int gameid, int score, string userID)
{
string message = "High Score achieved on " + gameid;
hub.Clients.Group(userID).score(message);
}
对于控制器操作,我传入用户 ID,然后调用上面提到的 HubHelper 方法。
希望这对某人有所帮助