有没有一种从控制器调用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属性 - 这很好。
希望有更好的方法吗?
答案 0 :(得分:18)
如果要通过集线器外部的集线器进行广播,则需要GlobalHost.ConnectionManager.GetHubContext<MyHub>()
来获取集线器上下文。然后,您可以使用此上下文通过.Clients
属性进行广播。
如您的示例代码中所示,您已经了解了集线器上下文,但在集线器内部这样做在我看来并不合适。如果您只使用控制器操作中的SendMessage()
中的逻辑,我会将代码直接移动到控制器操作中,并使用从那里通过GetHubContext<T>()
获得的中心上下文。
请注意,此方案中Caller
或Context
属性始终为null
,因为在向服务器发出请求时不涉及SignalR,因此无法提供属性
答案 1 :(得分:15)
找到一个DefaultHubManager,我认为这就是我所需要的。
DefaultHubManager hd = new DefaultHubManager(GlobalHost.DependencyResolver);
var hub = hd.ResolveHub("AdminHub") as AdminHub;
hub.SendMessage("woohoo");
作品。如果有更好/更优先的方式 - 请分享。