有没有一种从控制器调用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)
作品.如果有更好/首选的方式 - 请分享.
归档时间: |
|
查看次数: |
11222 次 |
最近记录: |