【问题标题】:SignalR Groups.Add times out and failsSignalR Groups.Add 超时并失败
【发布时间】:2016-01-13 23:55:49
【问题描述】:

我正在尝试使用 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 启动的 localhost 端口上运行前端(AngularJS SPA)。

我已经让 SignalR 工作到将消息广播到每个连接的客户端的地步。这似乎很容易。现在,添加“组”部分(这样人们只能从服务器获取选定的消息)让我大吃一惊……

【问题讨论】:

    标签: c# asp.net signalr signalr-hub


    【解决方案1】:

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

    你是如何得到这个connectionId的?您有多个服务器/端口正在运行 - 是否有可能让您的线路交叉?

    【讨论】:

    • 就是这样!该死的多么愚蠢的错误!我在这上面浪费了几个小时!我经常在本地服务器上的测试和远程生产服务器上的测试之间来回切换。浏览器正在与生产服务器上的 signalR 进行协商,然后我试图将该 connectionId 提供给本地服务器(显然不知道该 connectionId)
    【解决方案2】:

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

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

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

    问题在于,客户端可能没有响应,因为他们已断开连接(即他们已导航到另一个页面)。这意味着 await 调用必须等到连接断开(默认超时 30 秒)才能通过抛出 TaskCanceledException 放弃。

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

    【讨论】:

    • 那么避免这个异常正常吗?
    • 我的结论是你通常不应该等待 Groups.Add - 基本上你应该假设它会起作用。如果你真的需要知道它什么时候起作用,那么你需要接受你可能会等待长达 30 秒,并忽略 TaskCanceledException
    • 可以更改超时值吗?
    • @Andy,是的,但它还有其他副作用。超时是在您知道他们已经离开之前您没有收到客户的消息的时间量。 30 秒是有原因的 - 如果用户在他们的网络中出现故障,则可以轻松重新连接。我不建议更改它 - 只是不要等待将用户添加到组:它要么工作要么他们已经断开连接,所以没关系
    • @thab -- 明白了 -- 非常感谢。我将假设如果我等待并立即向该组发送消息,如果他们最终在 30 秒内被添加到该组,他们会收到该消息吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-11
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多