SignalR Groups.Add超时并失败

waf*_*les 3 c# asp.net signalr signalr-hub

我正在尝试使用SignalR 2.2将成员添加到组中.每次,我都会达到30秒的超时并获得"System.Threading.Tasks.TaskCanceledException:任务被取消了." 错误.

从我写的GroupSubscriptionController,我打电话给:

 var hubContext = GlobalHost.ConnectionManager.GetHubContext<ProjectHub>();
 await hubContext.Groups.Add(connectionId, groupName);
Run Code Online (Sandbox Code Playgroud)

我发现这个问题是人们经常遇到这个问题,但每次都发生在我身上.我正在一个VS2015上启动localhost端口运行后端(ASP.NET 4.5),而另一个VS 2015上的前端(AngularJS SPA)启动了localhost端口.

我已经让SignalR工作到了向每个连接的客户端广播消息的程度.这看起来很容易.现在,添加Groups部分(以便人们只从服务器获取选择的消息)让我把头发拉出来......

Reb*_*cca 5

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

你是怎么得到这个connectionId的?你有多个服务器/端口 - 你有可能让你的电线交叉吗?


tha*_*hab 5

我知道有一个可以接受的答案,但我曾因其他原因遇到过这个问题.

首先,您知道Groups.Add的作用吗?

我原本预计Groups.Add每次都会立即完成任务,但事实并非如此.Groups.Add当客户端(即Javascript)确认已将其添加到组中时,返回仅完成的任务 - 这对于重新连接非常有用,因此可以重新订阅其所有旧组.请注意,此确认信息对开发人员代码不可见,并且很好地为您提供了保护.

问题是客户端可能无法响应,因为它们已断开连接(即它们已导航到另一个页面).这意味着await调用必须等到连接断开连接(默认超时30秒)才放弃抛出a TaskCanceledException.

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