获取SignalR中的当前集线器

时间:2012-09-15 23:45:16

标签: signalr

有没有一种从控制器调用SignalR hub中的方法的好方法?

现在我有这个:

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没有Hub的Caller或Context属性 - 这很好。

希望有更好的方法吗?

2 个答案:

答案 0 :(得分:18)

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

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

请注意,此方案中CallerContext属性始终为null,因为在向服务器发出请求时不涉及SignalR,因此无法提供属性

答案 1 :(得分:15)

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

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

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