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<ChatHub>("/chat"); // 暴露端点,如 /chat
客户端:用 JavaScript 连接并收发消息
前端引入官方客户端库(推荐用 npm 安装
@microsoft/signalr,或直接 CDN):
<script src="https://cdn.jsdelivr.net/npm/@microsoft/signalr@8/dist/browser/signalr.min.js"></script>
建立连接、监听服务端方法、调用服务端方法,三步到位:
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 或跨域问题
基本上就这些。跑通一次连接+发消息,后面加群组、用户管理、权限控制就顺了。
