.Net 6 SignalR 实际业务开发中遇到的问题及解决办法
一、SiganlR 使用的协议类型
- 1.websocket即时通讯协议
- 2.Server-Sent Events(SSE)服务器事件
- 3.longpolling 长轮询。
如果客户端开启协商,会按顺序选择可兼容的协议。(默认开启协议协商)
如果客户端禁用协商,只能websocket协议。
二、连接过程
- 客户端未禁用协商
- 1.客户端向服务器发http请求,询问服务器支持什么协议。
服务端返回支持的协议类型,并分配ConnectionId。(http 协商请求) - 2.客户端确认协议后发送 websocket 请求,建立连接。(客户端会按顺序选择可兼容的协议)
- 1.客户端向服务器发http请求,询问服务器支持什么协议。
- 客户端禁用协商
- 客户端直接发送 websocket 请求,建立连接。
//客户端建立signalr连接时,指定配置参数,禁用协商。
const options = {
skipNegotiation: true,//是否跳过协商过程
transport: signalR.HttpTransportType.WebSockets,//直接指定使用websocket协议
};
connection = new signalR.HubConnectionBuilder()
.withUrl("https://localhost:7002/Hubs/ChatRoomHub",options)
.withAutomaticReconnect() //自动重连
.build();
三、身份认证
- websocket协议 无请求报文头headers,token只能放 QueryString 中,一般参数名定为 access_token。
- 在 Hub中引入身份认证服务,Hub OnConnectedAsync()中,即建立连接时,通过身份认证服务解析token是否合法并拿到用户信息。
四、分布式部署问题
问题1. 多节点环境,客户端协商过程,可能请求到不同服务器。
如果有AB两个服务器负载,在协商过程时
客户端第一次http请求A,A服务器记录了客户端连接信息上下文。
客户端第二次ws连接发送到B服务器,而B服务器没有客户端连接信息上下文,就出错了。
方式1. 粘性会话
网关服务器 或 负载均衡服务器 进行配置,把来自同一个客户端的请求都转发给同一台服务器。
- 优点:兼容性最好,客户端按兼容性依次选择协议
- 缺点:公网ip没办法平均分配,很难控制。
方式2. 禁用协商
客户端连接时设置禁用协商,连接时仅一次ws请求。
- 缺点:只能适用于兼容websocket的浏览器 只能使用websocket协议,无法使用 sse 和 longpolling
问题2. 多节点环境,消息不能跨服务器连接发送。
A服务器向全部连接发消息,只能发送到连接A服务器的客户端,不能发送给连接到B服务器的客户端。
- 解决办法:引入 Microsoft.AspNetCore.SignalR.StackExchangeRedis 包,注入分布式SignalR服务到DI中。
作用:在多个服务器实例之间共享消息和连接状态。确保跨服务器实例的连接同步和消息传递。services.AddSignalR(o =>
{
o.EnableDetailedErrors = true;//详细异常信息
o.HandshakeTimeout = TimeSpan.FromSeconds(30);//握手超时时间
}).AddStackExchangeRedis("{redis连接字符串}", opt =>
{
opt.Configuration.ChannelPrefix = "{RedisKey前缀}";
});//分布式 SignalR 消息
问题3. 在后台任务中使用Hub推送消息。
- 1.建立连接,从token中拿到用户信息。(分布式环境,多节点负载时,更新缓存需要加锁)
- 缓存: 用户id - [连接id集合]
- 缓存: 连接id - 用户id
- 2.断开连接,从缓存中移除 当前连接id。(分布式环境,多节点负载时,更新缓存需要加锁)
- 3.后台任务
- 注入分布式SignalR服务
- 注入Hub服务
- 业务中拿到要接收消息的 用户id集合
- 从缓存中找到对应的 全部连接id
- 调Hub向连接id推送SignalR消息
.Net 6 SignalR 实际业务开发中遇到的问题及解决办法的更多相关文章
- highcharts插件使用总结和开发中遇到的问题及解决办法
这里使用的highchart是2014-01-09从官网下载的版本,版本号是3.0.8, 当过了几天后,发现版本号变成了3.0.9,不由得的感叹highchart的版本更新之快. 在jsp中使用hig ...
- H5开发中遇到的问题及解决办法
记不得什么时候进行H5开发的学习了,只知道是从2016年8月1日开始修复Bug,计划每天把学到的东西以及遇到问题时候的解决方案都记录下来,希望自己能够坚持下去,每天积累一点,希望有所进步吧. 1.Th ...
- java开发中遇到的问题及解决方法(持续更新)
摘自 http://blog.csdn.net/pony12/article/details/38456261 java开发中遇到的问题及解决方法(持续更新) 工作中,以C/C++开发为主,难免与其他 ...
- 关于jFinal开发中遇到的中文乱码问题解决办法
关于jFinal开发中遇到的中文乱码问题解决办法 设置tomcat的编码,修改 <Connector port="8080" protocol="HTTP/1.1& ...
- iOS 学习笔记二【cocopods安装使用和安装过程中遇到的问题及解决办法】【20160725更新】
在osx 10.11之前cocopods问题不多,但是升级到11之后的版本,之前的cocopods大多用不了,需要重新安装,对于我这种使用测试版系统的技术狂来说,每次都需要重新安装很多东西, 当然,c ...
- iOS cocopods安装使用和安装过程中遇到的问题及解决办法
在osx 10.11之前cocopods问题不多,但是升级到11之后的版本,之前的cocopods大多用不了,需要重新安装,对于我这种使用测试版系统的技术狂来说,每次都需要重新安装很多东西, 当然,c ...
- 在vue中使用 layui框架中的form.render()无效解决办法
下面简单介绍在vue中使用 layui框架中的form.render()无效解决办法. 原文地址:小时刻个人技术博客 > http://small.aiweimeng.top/index.php ...
- Android开发:ScrollView嵌套GridView的解决办法
Android开发:ScrollView嵌套GridView的解决办法 前些日子在开发中用到了需要ScrollView嵌套GridView的情况,由于这两款控件都自带滚动条,当他们碰到一起的时候便 ...
- MyEclipse代码编辑器中汉字太小的解决办法(中文看不清)
问题描述:新安装的myeclipse 2014,代码编辑器中汉字很小看不清 解决办法:调整字体即可.通过菜单Windows——Preferences,输入font过滤选择Colors and Font ...
- 虚拟机中不能连接usb设备解决办法
虚拟机中不能连接usb设备解决办法 1.点击开始->运行,在对话框中输入"services.msc",确定,打开windows服务管理器.2.在服务列表中选中"VM ...
随机推荐
- memset函数&&bzro函数_C
// Code file created by C Code Develop #include "ccd.h" #include "stdio.h" #incl ...
- Jenkins 添加Linux固定代理节点
实践环境 Jenkins 2.304 jdk-8u131-linux-x64.rpm centos-release-7-9.2009.1.el7.centos.x86_64 操作步骤 安装JDK 在预 ...
- CF1883B Chemistry 题解
原题传送门 思路: 如"aba","abba"这样的回文字符串, 每个字符的出现次数有以下两种情况: 1:全部是偶数(abba) 2:只有一个为奇数(aba) ...
- Scratch植物大战僵尸全套素材包免费下载
scratch植物大战僵尸全套素材包,包含227个丰富多样的素材,涵盖角色.背景.动态gif.为Scratch创作者提供丰富资源,助力创作精彩作品. 免费下载地址:www.xiaohujing.com ...
- C语言中的断言函数assert
简介 assert 是 C 语言中的一个宏,用于在程序运行时进行条件检查,主要用于调试目的.它在 <assert.h> 头文件中定义,用于验证程序中的假设条件是否成立,如果不成立,程序将打 ...
- oracle数据库状态查询
oracle数据库状态查询(表空间,表空间利用率,是否自动扩展,IOPS,MBPS,数据库总大小) 排除了('SYSAUX', 'USERS', 'SYSTEM','UNDOTBS1') 结果示例 - ...
- 映射lun
环境 VMware1 网卡与 主机ping通 创建文件夹将文件解压进去 删除压缩包 创建虚拟机 下一步下一步,完成虚拟机 编辑虚拟机设置 否 账号密码 admin Admin@storage 等待 导 ...
- 【Spring】03 XML配置
Alias别名设置 可以为一个Bean的ID再设置一个ID 多一个可用标识,大概... 在获取实例注入参数时,两个标识都可以使用 除了Alias可以设置别名之外,Bean的标签本身也可以设置第二别名 ...
- 【Windows】XP系统安装TIM/QQ 数字签名过期问题
需要手动安装数字签名 右键安装包 -> 属性 但是我的TIM没有用,对QQ是有效的 参考自视频: https://www.bilibili.com/video/av413122971/
- 【Vue】12 VueRouter Part2 路由与传参
[编程式导航] 我们希望在路由跳转之前执行某一些功能... <template> <div id="app"> <h2>这是App.vue组件的 ...