SignalR 是 ASP.NET Core 提供的实时通信库,自动选择 websocket、SSE 或长轮询等最优传输方式,适用于聊天、通知、实时仪表盘等场景;服务端需定义 Hub 类并注册 SignalR 服务,客户端通过 javaScript 连接并收发消息。

SignalR 是什么,为什么选它
SignalR 是 ASP.NET Core 提供的实时通信库,能自动选择最优传输方式(WebSocket、Server-Sent Events 或长轮询),让你不用操心底层协议兼容性。它适合做聊天、通知、实时仪表盘、协同编辑等场景——写起来简单,跑起来稳定。
服务端:添加 Hub 并配置 SignalR
先创建一个继承 Hub 的类,比如 ChatHub,它就是客户端连接和调用的中心:
public class ChatHub : Hub { public async Task SendMessage(string user, string message) { await Clients.All.SendAsync("ReceiveMessage", user, message); } }
然后在 Program.cs 中注册 SignalR 服务并映射 Hub 路由:
var builder = Webapplication.CreateBuilder(args); builder.Services.AddSignalR(); // 注册服务 var app = builder.Build(); app.MapHub("/chat"); // 暴露端点,如 /chat
客户端:用 javascript 连接并收发消息
前端引入官方客户端库(推荐用 npm 安装 @microsoft/signalr,或直接 cdn):
建立连接、监听服务端方法、调用服务端方法,三步到位:
const connection = new signalR.HubConnectionBuilder() .withUrl("/chat") .build(); // 监听服务端 SendAsync("ReceiveMessage", ...) 的调用 connection.on("ReceiveMessage", (user, message) => { console.log(`${user}: ${message}`); }); // 启动连接 await connection.start(); // 调用服务端 SendMessage 方法 await connection.invoke("SendMessage", "Alice", "Hello World!");
常见注意点和小技巧
开发时容易卡住的地方,其实就几个关键细节:
- Hub 类不能有构造函数注入(除非用
ITransientDependency风格写法),推荐通过HubContext或属性注入获取服务 - 客户端调用的方法名默认区分大小写,服务端方法名是 PascalCase,客户端用 camelCase 调用(如
sendMessage对应SendMessage) - 连接断开后不会自动重连,需手动启用:
.withAutomaticReconnect() - 开发环境建议打开详细日志:
builder.Logging.AddConsole().SetMinimumLevel(LogLevel.Debug);,方便排查握手失败、CORS 或跨域问题
基本上就这些。跑通一次连接+发消息,后面加群组、用户管理、权限控制就顺了。