SignalR:在集线器上下文之外使用调用方法

时间:2017-04-16 23:02:04

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

我正在尝试在Hub Context之外使用Caller方法。我有一个帮助类,在向所有用户广播消息时工作正常:

hub.Clients.All.newLessonAlert(notif);

它不允许我在这个类中使用Caller方法,但这在hub上下文类中工作正常。为什么是这样?我还尝试将所有函数移到上下文类中,但现在我得到了这个无法解释的异常:

  

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

是否有一种直接的方法可以继续使用我的帮助程序类并识别与集线器的连接?

1 个答案:

答案 0 :(得分:1)

我通过以下方式解决了这个问题:

  1. 我在Hub类中创建了一个OnConnected方法。这将当前连接的用户分配给一个组。

    [HubName("NotificationsHub")]
    

    public class NotificationHub:Hub {     private static IHubContext hubContext = GlobalHost.ConnectionManager.GetHubContext();

    public override Task OnConnected()
    {
        string userid = Context.Request.User.Identity.GetUserId();
        Groups.Add(Context.ConnectionId, userid);
        return base.OnConnected();
    }
    

    }

  2. 修改了我的HubHelper类,现在将此警报广播给当前连接的用户(由用户的ID指定)

       public void HighScoreAlert(int gameid, int score, string userID)
    {
        string message = "High Score achieved on " + gameid;
    
        hub.Clients.Group(userID).score(message);
    }
    
  3. 对于控制器操作,我传入用户的ID,然后调用上面提到的HubHelper方法。

  4. 希望这有助于某人