您好,
我的服务器(azure webroles)上有一个Hub,使用以下方法:
public async Task<bool> Listen()
{
var userid = ...;
var observer = new BlackBoxObserver(userid){
OnObserver = async (x) => { await Clients.Caller.NewMessage(x);}
};
await Task.Delay(TimeSpan.FromMinutes(5));
await observer.Stop();
return true;
}
BlackBoxObserver
与SignalR无关,并在特定事件上调用OnObserver
。在此示例中,观察者在5分钟后停止并且hub方法返回。
我的问题是,这是否是关于使用集线器的有效方法?对于集线器呼叫,您是否需要考虑超时?
在这个StackOverflow Question操作状态中“集线器感觉不适合这样做。集线器应该被视为MVC / Web Api控制器吗?所以请求进来,集线器处理它,请求完成。故事结束。“。而后台工作者可能是个更好的主意。
所以我想我可以让客户端在调用hub方法时加入Sessiongroup,然后从后台线程调用观察者并按照here (asp.net/...)的描述调用该组。 这会是一个更好的方法吗?
然而,对于我来说,更简单,在某些情况下也更清洁的方式是等待更长时间的hub方法,但我不确定这是否会带来一些问题。
感谢您的帮助!
答案 0 :(得分:1)
我认为这些超时是可配置的,但您的问题似乎更具概念性。 显示的逻辑让我想起了一个longpolling结构,客户端向服务器发送请求。然后服务器等待,直到有新信息可用,然后返回响应给客户端。这正是SignalR试图从你身上抽象出来的事情。
更好的方法是传递需要信息和使用的客户端的connectionId:
var hub =GlobalHost.ConnectionManager.GetHubContext("yourhubname");
var client = hub.Clients.Client(connectionid);
获取集线器上下文并在需要/想要
时调用客户端