获取SignalR中的当前集线器

Evg*_*eni 12 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...
}
Run Code Online (Sandbox Code Playgroud)

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

StatsHub.Instance.SendMessage("blah");
Run Code Online (Sandbox Code Playgroud)

它几乎是好的,除了hubContext没有Hub的Caller或Context属性 - 这很好.

希望有更好的方法吗?

Ale*_*ger 18

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

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

请注意,Caller或者Context属性将始终null处于这种情况,因为在向服务器发出请求时不涉及SignalR,因此无法提供属性.


Evg*_*eni 16

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

DefaultHubManager hd = new DefaultHubManager(GlobalHost.DependencyResolver);
var hub = hd.ResolveHub("AdminHub") as AdminHub;
hub.SendMessage("woohoo");
Run Code Online (Sandbox Code Playgroud)

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

  • 这不再起作用(在SignalR 2中?).请参阅http://stackoverflow.com/questions/17896739/use-hub-methods-from-controller. (5认同)