我在一个移动应用程序中使用SignalR2.0和.NET客户端,该应用程序需要处理各种类型的断开.有时SignalR客户端会自动重新连接,有时必须通过再次拨打HubConnection.Start()直接重新连接.

Since SignalR magically auto-reconnects some of the time, I'm wondering if I'm missing a feature or config setting?

设置自动重新连接的客户端的最佳方法是什么?


我见过处理Closed()个事件,然后在n秒后连接的javascript示例.有什么推荐的方法吗?

我已经阅读了documentation篇和几篇关于信号器连接生命周期 的文章,但我仍然不清楚如何处理客户端重新连接.

推荐答案

我终于明白了.以下是我从这个问题开始学到的:

Background:我们正在使用Xamarin/Monotouch和.NET SignalR 2.0.3客户端构建一个iOS应用程序.我们使用的是默认的SignalR协议--它似乎使用的是SSE而不是Web套接字.我还不确定是否可以将web套接字与Xamarin/Monotouch一起使用.所有东西都是使用Azure网站托管的.

我们需要应用程序来快速重新连接到我们的SignalR服务器,但是我们总是遇到连接不能自动重新连接的问题--或者重新连接正好花了30秒(由于底层协议超时).

我们最终测试了三个场景:

Scenario A - connecting the first time the app was loaded.这从第一天起就完美无瑕.即使通过3G移动连接,连接也只需不到0.25秒即可完成.(假设 radio 已经开着)

Scenario B - reconnecting to the SignalR server after the app was idle/closed for 30 seconds.在这种情况下,Signal客户端最终将自行重新连接到服务器,而无需任何特殊工作,但它似乎要等待整整30秒才能try 重新连接.(对我们的应用来说太慢了)

在这30秒的等待时间里,我们try 拨打HubConnection.Start()没有效果.打电话给Hubbonnection.Stop()也需要30秒.我找到了a related bug on the SignalR site that appears to be resolved个,但我们在v2中仍然有同样的问题.0.3.

Scenario C - reconnecting to the SignalR server after the app was idle/closed for 120 seconds or longer.在这种情况下,信号传输协议已经超时,因此客户端永远不会自动重新连接.这就解释了为什么客户端有时会自行重新连接,但并不总是这样.好消息是,打电话给HubConnection.Start()几乎可以像场景A一样立即工作.

所以我花了一段时间才意识到,基于应用程序是否关闭了30秒和120多秒,重新连接的条件是不同的.尽管SignalR跟踪日志(log)说明了底层协议的情况,但我认为没有办法在代码中处理传输层事件.(在场景B中,Closed()事件在30秒后触发,在场景C中立即触发;State属性在这些重新连接等待期间显示为"Connected";没有其他相关事件或方法)

Solution:

.net相关问答推荐

在计算Total毫秒时,.NET TimeSpan类中是否存在错误?

等待时 Blazor 服务器按钮刷新

NET 6:控制器方法不可访问

使用 PEM 文件创建 DSA 签名

为什么 .NET 中的 System.Version 定义为 Major.Minor.Build.Revision?

您如何确定两个 HashSet 是否相等(按值,而不是按引用)?

如何在 C# 中创建表达式树来表示String.Contains("term")?

发布版本中的 Debug.WriteLine

使用 C# 清除文本文件的内容

.NET 世界是否有 Maven 替代方案或端口?

如何右对齐 DataGridView 列中的文本?

将跟踪输出重定向到控制台

如何将 UI Dispatcher 传递给 ViewModel

如何将枚举值序列化为 int?

如何使用 c# 仅获取目录中的文件名?

ILookup 接口与 IDictionary

具有不同身份验证标头的 HttpClient 单个实例

使用 C# 将时间跨度值转换为格式hh:mm Am/Pm

为 webClient.DownloadFile() 设置超时

程序员应该使用 SSIS,如果是,为什么?