SignalR Groups.Add 超时并失败

SignalR Groups.Add times out and fails

我正在尝试使用 SignalR 2.2 将成员添加到组中。每一次,我都会遇到 30 秒超时并收到 "System.Threading.Tasks.TaskCanceledException: A task was canceled." 错误。

我正在从我编写的 GroupSubscriptionController 调用:

 var hubContext = GlobalHost.ConnectionManager.GetHubContext<ProjectHub>();
 await hubContext.Groups.Add(connectionId, groupName);

我发现这个 issue 人们经常遇到这个问题,但它每次都发生在我身上。我是 运行 一个 VS2015 启动的本地主机端口上的后端 (ASP.NET 4.5),以及另一个 VS2015 启动的本地主机端口上的前端 (AngularJS SPA)。

我已经让 SignalR 工作到可以向每个连接的客户端广播消息的程度。这似乎很容易。现在,添加组部分(这样人们只能从服务器获得 select 消息)让我很紧张...

可能会抛出任务取消错误,因为无法在已连接客户端的 SignalR 注册表中找到 connectionId。

您如何获得此 connectionId?您有多个 servers/ports 正在进行中 - 是否有可能您的电线交叉了?

我知道对此有一个公认的答案,但我曾经出于不同的原因遇到过这个问题。

首先,你知道 Groups.Add 是做什么的吗?

我原以为 Groups.Add 的任务几乎每次都能立即完成,但事实并非如此。 Groups.Add returns 仅当客户端(即 Javascript)确认已将其添加到组时才完成的任务 - 这对于重新连接很有用,因此它可以重新订阅所有旧的团体。请注意,此确认对开发人员代码不可见,并且为您很好地掩盖了。

问题是 客户端可能不会响应 因为他们已经断开连接(即他们已经导航到另一个页面)。这意味着 await 调用必须等到连接断开(默认超时 30 秒),然后才会抛出 TaskCanceledException.

有关组的更多详细信息,请参阅http://www.asp.net/signalr/overview/guide-to-the-api/working-with-groups