13

有没有从控制器调用 SignalR 集线器中方法的好方法?

现在我有这个:

public class StatsHub : Hub
{
    private static readonly Lazy<StatsHub> instance = new Lazy<StatsHub>(() => new StatsHub());
    public static StatsHub Instance { get { return instance.Value; } }

    public StatsHub()
    {
        if (this.Clients == null)
        {
            var hubContext = SignalR.GlobalHost.ConnectionManager.GetHubContext<StatsHub>();
            this.Clients = hubContext.Clients;
            this.Groups = hubContext.Groups;
        }
    }

    // methods here...
}

所以在我的控制器动作中,我只能说,例如

StatsHub.Instance.SendMessage("blah");

它几乎很好,除了 hubContext 没有集线器的 Caller 或 Context 属性——这些属性很好。

希望有更好的方法来做到这一点?

4

2 回答 2

18

如果要从集线器外部通过集线器进行广播,则需要GlobalHost.ConnectionManager.GetHubContext<MyHub>()获取集线器上下文。然后,您可以使用此上下文通过.Clients属性进行广播。

如您的示例代码所示,您已经掌握了集线器上下文,但在我看来,在集线器内部这样做感觉不对。如果您只使用SendMessage()控制器操作中的逻辑,我会将代码直接移动到控制器操作中并使用GetHubContext<T>()从那里获得的集线器上下文。

请注意,CallerorContext属性将始终null在这种情况下,因为 SignalR 在向服务器发出请求时没有参与,因此无法提供属性。

于 2012-09-17T17:03:40.790 回答
16

找到了一个 DefaultHubManager,我认为这是我需要的。

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

作品。如果有更好/首选的方式 - 请分享。

于 2012-09-17T12:10:28.950 回答