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 或跨域问题
基本上就这些。跑通一次连接+发消息,后面加群组、用户管理、权限控制就顺了。
