Signalr 获取信号机中的当前集线器

Signalr 获取信号机中的当前集线器,signalr,Signalr,从控制器调用SignalrHub中的方法有好方法吗 现在我有这个: public class StatsHub : Hub { private static readonly Lazy<StatsHub> instance = new Lazy<StatsHub>(() => new StatsHub()); public static StatsHub Instance { get { return instance.Value; } }

从控制器调用SignalrHub中的方法有好方法吗

现在我有这个:

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...
}
除了hubContext没有Hub的调用者或上下文属性之外,它几乎是好的,这很好


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

找到了DefaultHubManager,我想这正是我需要的

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

工作。如果有更好的/首选的方法-请共享。

如果您想从中心外部通过中心广播,您需要
GlobalHost.ConnectionManager.GetHubContext()
获取中心上下文。然后,您可以使用此上下文通过
.Clients
属性进行广播

正如您的示例代码中所指出的,您已经掌握了中心上下文,但在我看来,在中心内部这样做是不对的。如果您仅在控制器操作中使用
SendMessage()
中的逻辑,我会将代码移到控制器操作中,并使用从那里通过
GetHubContext()
获得的中心上下文


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

这不再有效(在SignalR 2中?)。请参阅。
DefaultHubManager
存在于SignalR 2.x中,但是
hub.Context
为空,因此所有操作都会失败。这在SignalR 2.0中起作用,但我使用的hub实例异常不是由hubbipline创建的,因此不受支持
DefaultHubManager hd = new DefaultHubManager(GlobalHost.DependencyResolver);
var hub = hd.ResolveHub("AdminHub") as AdminHub;
hub.SendMessage("woohoo");