我正在尝试使用SignalR 2.2将成员添加到组中。每次,我都会达到30秒的超时并获得“System.Threading.Tasks.TaskCanceledException:任务被取消了。”错误。
从我写过的GroupSubscriptionController,我正在打电话:
var hubContext = GlobalHost.ConnectionManager.GetHubContext<ProjectHub>();
await hubContext.Groups.Add(connectionId, groupName);
我发现这个issue人们经常会遇到这种情况,但每次都会发生在我身上。我正在一个VS2015上启动localhost端口运行后端(ASP.NET 4.5),而另一个VS 2015上的前端(AngularJS SPA)启动了localhost端口。
我已经让SignalR工作到了向每个连接的客户端广播消息的程度。这看起来很容易。现在,添加Groups部分(以便人们只从服务器获取选择的消息)让我把头发拉出来......
答案 0 :(得分:5)
可能会抛出任务取消错误,因为无法在已连接客户端的SignalR注册表中找到connectionId。
你是如何得到这个connectionId的?您有多个服务器/端口 - 您是否可以将电线交叉?
答案 1 :(得分:5)
我知道有一个可以接受的答案,但我出于不同的原因遇到过这个问题。
首先,您知道Groups.Add的作用吗?
我原本预计Groups.Add
的任务每次都会立即完成,但不是这样。 Groups.Add
返回仅在客户端(即Javascript)确认已添加到组中时才完成的任务 - 这对于重新连接非常有用,因此可以重新订阅其所有旧组。请注意,此确认信息对开发人员代码不可见,并为您提供了很好的保护。
问题是客户端可能无法响应,因为它们已断开连接(即它们已导航到另一个页面)。这意味着await
调用必须等到连接断开连接(默认超时30秒)才放弃TaskCanceledException
。
有关群组的详细信息,请参阅http://www.asp.net/signalr/overview/guide-to-the-api/working-with-groups