.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 ...
随机推荐
- 使用 useRequestEvent Hook 访问请求事件
title: 使用 useRequestEvent Hook 访问请求事件 date: 2024/7/23 updated: 2024/7/23 author: cmdragon excerpt: 摘 ...
- 解决 IIS Express 启动错误:“拒绝访问”问题
报错 Starting IIS Express ... stderr: Failed to register URL "http://localhost:8378/" for si ...
- Python 实现行为驱动开发 (BDD) 自动化测试详解
在当今的软件开发领域,行为驱动开发(Behavior Driven Development,BDD)作为一种新兴的测试方法,逐渐受到越来越多开发者的关注和青睐.Python作为一门功能强大且易于使 ...
- app专项测试:app弱网测试(测试工具)
app专项测试:app弱网测试(测试工具) 除了常用的 fiddler,charles 可以模拟弱网,还有硬件工具弱网仪 HoloWAN也可以模拟弱网 使用弱网仪有以下优点:1.即插即用,无需调试和复 ...
- canvas实现截图功能
开篇 最近在做一个图片截图的功能. 因为工作时间很紧张, 当时是使用的是一个截图插件. 周末两天无所事事,来写一个简单版本的截图功能. 因为写的比较简单,如果写的不好,求大佬轻一点喷 读取图片并获取图 ...
- 【MySQL】 批量更改库,表,字段的字符集
库一级的更改: -- 单个库字符集更改 ALTER DATABASE `ymcd_aisw` CHARACTER SET 'utf8' COLLATE 'utf8_general_ci'; ALTER ...
- 【Vue】Re23 组件封装
视频地址: https://www.bilibili.com/video/BV15741177Eh?p=119 common.css /* 演示案例是base.css */ body { paddin ...
- 【CMake系列】06-项目结构与输出路径管理
为了对大型项目实现更好的管理[模块化协作开发等等],cmake 提供了很多指令,可以对项目的结构进行调整.管理,便于项目的合理规划.本文我们要学习的就是 项目结构的设置,以及 构建程序等 输出路径的设 ...
- 关于EF延时加载的面试题
public async Task<ActionResult> GetData() { var data = (from leftdata in GetLeft() join rightd ...
- 折腾 Quickwit,Rust 编写的分布式搜索引擎(专为从对象存储中实现亚秒级搜索而设计)
什么是 Quickwit? Quickwit 是首个能在云端存储上直接执行复杂的搜索与分析查询的引擎,并且具有亚秒级延迟.它借助 Rust 语言和分离计算与存储的架构设计,旨在实现资源高效利用.易于操 ...