SignalR 通过 Hub 建立服务端与客户端的双向长连接实现实时通信,支持自动降级传输方式。Hub 管理连接、分组与消息推送,客户端需调用 start() 并监听指定函数名接收消息。

SignalR 实现实时通信,核心就是靠 Hub(集线器) 建立服务端与客户端的双向长连接,并通过它来主动推送消息。它不是轮询,也不需要客户端反复请求——服务器有新数据时,直接“喊一声”,所有在线客户端立刻收到。
Hub 是怎么工作的
Hub 是 SignalR 的通信中枢。你写一个继承 Hub 的类(比如 ChatHub),它就自动具备了管理连接、分组、广播和定向通信的能力。客户端连上来后,会获得一个唯一的 ConnectionId,服务端随时能用它发消息。
每个客户端连接都会触发 OnConnectedAsync(),断开则触发 OnDisconnectedAsync() Hub 类里的 public async Task 方法,可被客户端调用(如发送聊天内容) Hub 类里调用 Clients.XXX.SendAsync(),就能把消息推给指定目标
常用的推送消息方法
消息不是“发给页面”,而是“发给客户端上某个已定义的 JavaScript 函数”。所以服务端推送时,要指定函数名(如 "ReceiveMessage"),客户端提前用 connection.on("ReceiveMessage", ...) 监听好。
Clients.All.SendAsync("ReceiveMessage", user, msg) —— 推送给所有已连接客户端 Clients.Client(connectionId).SendAsync(...) —— 只推给某一个特定连接(适合私聊或状态同步) Clients.User(userId).SendAsync(...) —— 推给某个用户的所有设备(需配合身份认证) Clients.Group("room1").SendAsync(...) —— 推给加入某组的客户端(如聊天室、协作白板)
前后端怎么配起来
服务端配置好 Hub 类和路由,前端才能连上。关键三步不能漏:
服务端:在 Program.cs 中注册服务 builder.Services.AddSignalR(),并映射路由 app.MapHub("/chathub") 前端:引入 signalr.js,用 new HubConnectionBuilder().withUrl("/chathub").build() 创建连接 连接建立后,必须调用 await connection.start(),再注册监听 connection.on("ReceiveMessage", ...)
消息能自动适配不同网络环境
SignalR 不硬绑 WebSocket。它会在运行时自动协商传输方式:优先用 WebSocket(最快最省资源),浏览器不支持就降级到 Server-Sent Events,再不行就用 Long Polling。开发者完全不用操心兼容性问题,写一套代码,全平台可用。
基本上就这些。不复杂但容易忽略细节——比如忘了 start()、函数名大小写不一致、或者没处理连接失败重试。把 Hub 当作一个“实时消息中转站”,理清谁发、发给谁、谁在听,就稳了。
以上就是SignalR怎么实现实时通信 SignalR Hub推送消息方法的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1443276.html
微信扫一扫
支付宝扫一扫