起因:

 ASP.NET Core SignalR是一个开源库,可简化向应用添加实时 SignalR Web 功能。 实时 Web 功能使服务器端代码能够立即将内容推送到客户端。(相信大家都用得比较多了)

 在应用过程中,出现某些异常断开连接情况,那么如何处理客户端自动重连呢?

问题现象:

 服务器因某些特殊原因,导致服务停止一段时间后;当服务端重启后,Signalr连接的客户端未能自动连接到服务上。

解决办法:

 实现自动断线重连的2种方式:

  • 在onClose事件中手动重新创建连接:
connection.Closed += async (error) =>
{
//等待3s后重新创建连接
await Task.Delay(3* 1000);
await connection.StartAsync();
};
  • 将配置为使用方法 WithAutomaticReconnect 自动重新连接

  重连规则:

如果客户端在其指定次数尝试内成功重新连接,则 HubConnection 将转换回 Connected 状态并激发 Reconnected 事件。 这为用户提供了通知用户已重新建立连接并取消排队消息的排队的机会。

如果客户端在其指定次数尝试中未成功重新连接,则 HubConnection 将转换为 Disconnected 状态并触发 Closed 事件。 这为尝试手动重新启动连接或通知用户连接永久丢失有机会。

  1、WithAutomaticReconnect在没有任何参数的情况下, 将客户端配置为分别等待0、2、10 和 30 秒,然后尝试每次重新连接尝试,在四次尝试失败后停止。出发Closed事件

HubConnectionBuilder hubConnectionBuilder = new HubConnectionBuilder();
hubConnectionBuilder.WithUrl(url, options => { });
//重连
hubConnectionBuilder = (HubConnectionBuilder)hubConnectionBuilder
.WithAutomaticReconnect();
//创建连接对象
hubConnection = hubConnectionBuilder.Build();
//断开连接
hubConnection.Closed += HubConnection_Closed;
//重连中
hubConnection.Reconnecting += HubConnection_Reconnecting;
//重连成功
hubConnection.Reconnected += HubConnection_Reconnected;
//心跳检查
hubConnection.KeepAliveInterval = TimeSpan.FromSeconds(60);

  2、指定断线重连参数:连接规则同上(次数变成指定的3次)

//指定重连间隔:0s,0s,10s
HubConnection connection= new HubConnectionBuilder()
.WithUrl(new Uri("http://127.0.0.1:5000/chathub"))
.WithAutomaticReconnect(new[] { TimeSpan.Zero, TimeSpan.Zero, TimeSpan.FromSeconds(10) })
.Build();

  3、自定义重连规则使用:实现一直自动重连

HubConnectionBuilder hubConnectionBuilder = new HubConnectionBuilder();
hubConnectionBuilder.WithUrl(url, options => { });
//自定义重连规则实现
hubConnectionBuilder = (HubConnectionBuilder)hubConnectionBuilder
.WithAutomaticReconnect(new RetryPolicy());

  重连规则实现:重连规则:重试次数<50:间隔1s;重试次数<250:间隔30s;重试次数>250:间隔1m

//实现IRetryPolicy接口
class RetryPolicy : IRetryPolicy
{
/// <summary>
/// 重连规则:重连次数<50:间隔1s;重试次数<250:间隔30s;重试次数>250:间隔1m
/// </summary>
/// <param name="retryContext"></param>
/// <returns></returns>
public TimeSpan? NextRetryDelay(RetryContext retryContext)
{
var count = retryContext.PreviousRetryCount / 50;
if (count < 1)//重试次数<50,间隔1s
{
return new TimeSpan(0, 0, 1);
}
else if (count < 5)//重试次数<250:间隔30s
{
return new TimeSpan(0, 0, 30);
}
else //重试次数>250:间隔1m
{
return new TimeSpan(0, 1, 0);
}
}
} 

其他常见用法:

 1、服务端/客户端配置:

  a)Json序列化属性名不修改大小写:

services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});

  b)服务端常用配置属性:

   属性配置使用方式:

public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}

   配置属性说明如下:

选项 默认值 说明
ClientTimeoutInterval 30 秒 如果客户端未收到消息 (在此时间间隔内包含 keep-alive) ,服务器将认为客户端已断开连接。 由于实现方式的原因,客户端实际标记为断开连接可能需要更长的时间。 建议值为值的两倍 KeepAliveInterval 。
HandshakeTimeout 15 秒 如果客户端在此时间间隔内未发送初始握手消息,连接将关闭。 这是一种高级设置,只应在握手超时错误由于严重网络延迟而发生时进行修改。 有关握手过程的详细信息
KeepAliveInterval 15 秒 如果服务器未在此时间间隔内发送消息,则会自动发送 ping 消息,使连接保持打开状态。 更改时 KeepAliveInterval ,请更改 ServerTimeout / serverTimeoutInMilliseconds 客户端上的设置。 建议 ServerTimeout / serverTimeoutInMilliseconds 值为值的两倍 KeepAliveInterval 。
SupportedProtocols 所有已安装的协议 此中心支持的协议。 默认情况下,将允许在服务器上注册的所有协议,但可以从此列表中删除协议,以禁用各个集线器的特定协议。
EnableDetailedErrors false 如果为,则在 true 集线器方法中引发异常时,详细的异常消息将返回到客户端。 默认值为 false ,因为这些异常消息可能包含敏感信息。
StreamBufferCapacity 10 可为客户端上载流缓冲的最大项数。 如果达到此限制,则会阻止处理调用,直到服务器处理流项。
MaximumReceiveMessageSize 32 KB 单个传入集线器消息的最大大小。
MaximumParallelInvocationsPerClient 1 每个客户端可以在进行排队之前并行调用的最大集线器方法数。


 2、如何提升Signalr传输性能:

  使用MessagePackc传输:MessagePack 是一种快速、精简的二进制序列化格式。 当性能和带宽需要考虑时,它很有用,因为它会创建比 JSON更小的消息。

  在查看网络跟踪和日志时,不能读取二进制消息,除非这些字节是通过 MessagePack 分析器传递的。 SignalR 提供对 MessagePack 格式的内置支持,并为客户端和服务器提供要使用的 Api。

  使用方式:添加包Microsoft.AspNetCore.SignalR.Protocols.MessagePack,在 Startup.ConfigureServices 方法中,将添加 AddMessagePackProtocol 到在 AddSignalR 服务器上启用 MessagePack 支持的调用

services.AddSignalR().AddMessagePackProtocol();

参考:

 https://docs.microsoft.com/zh-cn/aspnet/core/signalr/introduction

【问题记录】—SignalR连接断线重连的更多相关文章

  1. SignalR控制台自托管服务端向web客户端指定用户推送数据,客户端断线重连

    一.前言 SignalR是微软推出的开源实时通信框架.其内部使用Web Socket, Server Sent Events 和 Long Polling作为底层传输方式,SignalR会根据客户端和 ...

  2. .net/c# RabbitMQ 连接断开处理-断线重连(转载)

    Rabbitmq 官方给的NET consumer示例代码如下,但使用过程,会遇到connection断开的问题,一旦断开,这个代码就会报错,就会导致消费者或者生产者挂掉. 下图是生产者发送消息,我手 ...

  3. Netty(六):Netty中的连接管理(心跳机制和定时断线重连)

    何为心跳 顾名思义, 所谓心跳, 即在TCP长连接中, 客户端和服务器之间定期发送的一种特殊的数据包, 通知对方自己还在线, 以确保 TCP 连接的有效性. 为什么需要心跳 因为网络的不可靠性, 有可 ...

  4. RabbitMQ---8、连接断开处理-断线重连

    本文转载于:https://www.itsvse.com/thread-4636-1-1.html: 参考文献:http://www.likecs.com/show-29874.html:https: ...

  5. nodejs使用MYSQL连接池,断线重连

    两种方式解决1.你可以配置mysql的连接池 var mysql = require('mysql'); var pool = mysql.createPool({ host: 'localhost' ...

  6. android 实现mqtt消息推送,以及不停断线重连的问题解决

    前段时间项目用到mqtt的消息推送,整理一下代码,代码的原型是网上找的,具体哪个地址已经忘记了. 代码的实现是新建了一个MyMqttService,全部功能都在里面实现,包括连服务器,断线重连,订阅消 ...

  7. Mina.Net实现的断线重连

    using Mina.Filter.Codec; using Mina.Filter.Codec.TextLine; using System; using System.Collections.Ge ...

  8. Netty学习篇④-心跳机制及断线重连

    心跳检测 前言 客户端和服务端的连接属于socket连接,也属于长连接,往往会存在客户端在连接了服务端之后就没有任何操作了,但还是占用了一个连接:当越来越多类似的客户端出现就会浪费很多连接,netty ...

  9. java-websocket客户端 断线重连 注入Service问题

    java版客户端: 使用开源项目java-websocket, github地址: https://github.com/TooTallNate/Java-WebSocket github上有很多示例 ...

随机推荐

  1. RDPInception攻击手法

    在讲RDPInception攻击手段之前,我们先了解一下RDP远程桌面(Remote Desktop Protocol)协议.RDP远程桌面协议(Remote Desktop Protocol)是一个 ...

  2. Python 爬虫与HTTP协议简介

    爬虫的实际例子: 搜索引擎(百度.谷歌.360搜索等). 伯乐在线. 惠惠购物助手. 数据分析与研究(数据冰山知乎专栏). 抢票软件等. 什么是网络爬虫: 通俗理解:爬虫是一个模拟人类请求网站行为的程 ...

  3. Windows核心编程 第八章 用户方式中线程的同步(上)

    第8章 用户方式中线程的同步 当所有的线程在互相之间不需要进行通信的情况下就能够顺利地运行时, M i c r o s o f t Wi n d o w s的运行性能最好.但是,线程很少能够在所有的时 ...

  4. ATK&CK红队评估实战靶场 (一)的搭建和模拟攻击过程全过程

    介绍及环境搭建 靶机地址:http://vulnstack.qiyuanxuetang.net/vuln/detail/2 官方靶机说明: 红队实战系列,主要以真实企业环境为实例搭建一系列靶场,通过练 ...

  5. Linux查看进程和查看端口占用

    查看进程 ps -ef|grep ****.jar 查看端口占用(如果出现命令找不到,安装一下工具即可) netstat -lnp|grep 端口号 (命令找不到解决办法) yum install n ...

  6. Govern EventBus - 历经多年生产环境验证的事件驱动架构框架

    Govern EventBus Govern EventBus 是一个历经四年生产环境验证的事件驱动架构框架, 通过事件总线机制来治理微服务间的远程过程调用. 使用本地事务来支持微服务内强一致性,事件 ...

  7. SparkSQL电商用户画像(三)之环境准备

    五. 电商用户画像环境搭建 众所周知,Hive的执行任务是将hql语句转化为MapReduce来计算的,Hive的整体解决方案很不错,但是从查询提交到结果返回需要相当长的时间,查询耗时太长.这个主要原 ...

  8. 关于ajax的数据传输类型,字符串传输

  9. 深入源码,深度解析Java 线程池的实现原理

    java 系统的运行归根到底是程序的运行,程序的运行归根到底是代码的执行,代码的执行归根到底是虚拟机的执行,虚拟机的执行其实就是操作系统的线程在执行,并且会占用一定的系统资源,如CPU.内存.磁盘.网 ...

  10. [刷题] 51 N-Queens

    要求 将n个皇后摆放在n*n的棋盘中,使横.竖和两个对角线方向均不会同时出现两个皇后 思路 尝试在一行中摆放,如果摆不下,回到上一行重新摆放,直到所有行都摆下 快速判断不合法情况 竖向:col[i]表 ...