Signalr 重试逻辑 .Net Core

问题描述 投票:0回答:3

我们在 Signalr .Net Core 中遇到了重新连接问题,重新连接到 signalr-hub 的最佳实践是什么?

以下似乎是有关重新连接的最受尊敬的文章。但似乎已经过时了,不是吗? 将 SignalR 2.0 .NET 客户端重新连接到服务器集线器的最佳实践

.net-core signalr asp.net-core-signalr
3个回答
7
投票

执行此“重新连接”的最佳方法是使用

WithAutomaticReconnect
方法。

因此,您可以使用内置的重新连接逻辑,而不是编写自己的重新连接逻辑。

首先,您必须删除当前的重新连接逻辑,并将

.WithAutomaticReconnect()
添加到您的
HubConnectionBuilder

现在您有两个选择:

默认行为:

此方法的默认值为

TimeSpan[0, 2000, 10000, 30000, null]
,这意味着每次尝试重新连接失败后,它将等待 X (0, 2, 10, 30) 秒。一旦达到
null
,它将停止尝试。

你可以自定义这个数组,但它的末尾总是有一个空值,如果你想让它无限尝试,它就会变得不可靠。 这给我们带来了下一个选择:

自定义 IRetryPolicy

IRetryPolicy
表示每次尝试重新连接失败后,
HubConnectionBuilder
必须等待多少秒。

此方法无限运行,直到连接恢复。

实现自定义

IRetryPolicy
:

public class RetryPolicyLoop : IRetryPolicy
{
    private const int ReconnectionWaitSeconds = 5;
    
    public TimeSpan? NextRetryDelay(RetryContext retryContext)
    {
        return TimeSpan.FromSeconds(ReconnectionWaitSeconds);
    }
}

这就是您的

HubConnectionBuilder
中的样子:

.WithAutomaticReconnect(new RetryPolicyLoop())

3
投票

目前你必须编写自己的重连逻辑。该文档提供了如何为 Javascript 客户端.NET 客户端 进行简单重新连接的示例。


0
投票

(您的链接引用的是SignalR的.NET(4.x)客户端/版本,而不是.NET CORE版本。它并没有过时。它们在很多方面都有明显不同,并且彼此不兼容。您必须使用带有 .NET CORE 客户端的 .NET CORE 集线器,您不能将它们与旧版 .NET (4.x) 集线器或客户端混合使用。

根据 2017 年的这个问题(截至本文发布时该问题仍处于开放状态),David Fowler 表示“我们正在考虑在下一个预览版本中将自动重新连接功能添加回 SignalR。”

因此,根据您所在的版本以及此问题所在的位置,您需要跟进该项目。

https://github.com/aspnet/AspNetCore/issues/5282

© www.soinside.com 2019 - 2024. All rights reserved.