请详细解释 Blazor SignalR / 电路超时

som*_*guy 5 signalr blazor asp.net-core-6.0

搜索主题:

在上面的文章中,如果看到设置超时的示例。而且文档还解释了客户端和服务器端,每个 ofc 都可能突然崩溃/关闭,或者网络可能被切断等。所以双方似乎都有超时来做不同的事情,比如“向下”(=试图重新连接),最后“关闭”。所以...

问题#1:如何分别为客户端和服务器设置所有(至少 4 个)超时(包括保持活动状态)?

SO帖子显示了JS的答案和program.cs中的答案,有什么区别?它实际上是服务器/客户端吗?客户端启动时可以用C#设置还是需要用JS设置?如果是这样,相关文档在哪里?

问题#2:如何知道服务器端超时?

我从默认模板 (.NET 6) 创建了一个全新的 Blazor 服务器项目,并添加了 SO 帖子中的代码以查看所有电路。当我在 LAN 中运行它并且客户端(其他 PC)打开 Clicker,然后将 PC 置于完全休眠状态时,我看到了该OnConnectionDownAsync事件,但即使在 2 分钟后,也没有OnCircuitClosedAsync(它实际上也有效。之后打开 PC 2mins 实际上会让浏览器重新连接并OnConnectionUpAsync自动启动,无需OnCircuitOpenedAsync)。为什么?超时时间真的很长吗?我在哪里可以读取默认超时的变量,在哪里设置它?服务器保留线路信息多长时间,以便客户端可以重新连接?这不是 5 秒(请参阅上面的链接)。

更新:另一项测试确认断开连接超时似乎正好是 3 分钟(180 秒)。现在我需要了解如何设置它。注意:似乎不是options.WebSockets.CloseTimeout

也不是options.ClientTimeoutInterval

文档说了一些关于

Application_Start在你的Global.asax

我从未读过相关内容。那是什么?这实际上是针对 Blazor 还是其他一些 ASP.NET 项目类型。这是唯一(正确)的方法吗?[编辑:它适用于较旧的框架,而不是 ASP.NET Core 6+]

问题 #3:提到的 5 秒超时是多少?它的观察。服务器完全关闭之前不会超时。

问题 #4AddHubOptions :...和MapBlazorHub...options...之间有什么区别?

从这里

services.AddServerSideBlazor()
                .AddHubOptions(options =>
                {
                    options.ClientTimeoutInterval = TimeSpan.FromMinutes(10);
                    options.KeepAliveInterval = TimeSpan.FromSeconds(3);
                    options.HandshakeTimeout = TimeSpan.FromMinutes(10);
                });
Run Code Online (Sandbox Code Playgroud)

app.UseEndpoints(endpoints =>
    // other settings go here
    endpoints.MapBlazorHub(options => {
        options.WebSockets.CloseTimeout = new TimeSpan(1, 1, 1);
        options.LongPolling.PollTimeout = new TimeSpan(1, 0, 0);
    })
);
Run Code Online (Sandbox Code Playgroud)

更新:似乎上面的链接指的是旧版本... 可能是新版本。我希望它能发出一些光芒……

它已经回答了这个:

CloseTimeout 5 秒
服务器关闭后,如果客户端在该时间间隔内未能关闭,则连接被终止。

这是什么意思,“它可能需要更长的时间”,从来没有说过它正好是 180 秒,如果它是错误的,为什么还要有变量?

ClientTimeoutInterval 30 秒
如果在此时间间隔内没有收到消息(包括保持连接),则服务器认为客户端已断开连接。由于实现方式的原因,客户端可能需要比此超时间隔更长的时间才能被标记为断开连接。建议的值是 KeepAliveInterval 值的两倍。

[更新]:

这似乎是新文档。这回答了我的一些问题(部分)。我仍然不完全清楚所有选项如何协同工作,并且缺少一个很好的工作示例(所有选项都应用并演示了)。

特别是客户端超时似乎有点不一致和令人困惑,请参阅我的其他有关 SignalR 计时间隔的问题。