什么是 .NET SignalR
.NET SignalR 是微软为 ASP.NET 和 ASP.NET Core 提供的一个实时通信库,用于构建实时 Web 应用。它允许服务器在数据发生变化时主动向客户端推送消息,而不需要客户端不断刷新页面或轮询接口。在传统 Web 应用中,浏览器通常需要通过定时请求服务器(如 Ajax 轮询)来获取新数据。而使用 SignalR 后,服务器可以直接向所有连接的客户端发送消息,从而实现真正的实时通信体验。

SignalR 内部会优先使用 WebSocket 实现双向通信,当浏览器或服务器不支持 WebSocket 时,它会自动降级到 Server-Sent Events 或 Long Polling 等技术,但开发者无需修改应用代码。因此,SignalR 被广泛用于构建以下类型的应用:
- 在线聊天系统
- 实时数据仪表盘
- 实时通知系统
- 在线协作工具(例如共享编辑)
- 实时游戏或监控系统
SignalR 的核心概念
SignalR 的架构主要由 Hub、Client 和 Connection 等组件组成,这些组件共同构成了实时通信机制。
1、Hub(通信中心)
Hub 是 SignalR 的核心组件,本质上是一个运行在服务器上的 C# 类。通过 Hub 可以实现:
- 客户端调用服务器方法
- 服务器调用客户端方法
- 向指定用户或群组发送消息
例如聊天系统中的 ChatHub 就负责转发消息。
2、Client(客户端)
客户端通常是浏览器、移动应用或桌面程序。SignalR 提供多种客户端 SDK,例如:
- JavaScript
- .NET (C# / F# / VB)
- Java
- Swift
因此一个 SignalR 服务可以同时被 Web、移动端和桌面应用连接。
3、Connection(连接)
每个客户端连接到 SignalR 服务器时都会获得一个 Connection ID。服务器可以基于连接 ID 实现不同的消息发送模式,例如:
- 广播消息(发送给所有客户端)
- 单播消息(发送给某个客户端)
- 群组消息(发送给某个群组)
这种机制非常适合实现聊天室或实时协作应用。
SignalR 的工作原理
SignalR 的通信模式是 双向实时通信。基本流程如下:
- 客户端与服务器建立连接
- SignalR 自动协商通信协议(WebSocket / SSE / Long Polling)
- 客户端订阅服务器事件
- 服务器在数据变化时向客户端推送消息
消息通常以 JSON 或 MessagePack 进行序列化传输,其中 MessagePack 可以减少数据体积并提升性能。此外,SignalR 还提供了许多高级功能,例如:
- 连接生命周期管理
- 自动重连
- 用户身份验证
- 分布式扩展(Redis、Azure SignalR Service)
ASP.NET Core SignalR 基本使用方法
下面以一个简单的聊天应用为例,介绍 SignalR 的基本使用流程。
1. 创建 ASP.NET Core 项目
首先创建一个 ASP.NET Core Web 项目,并安装 SignalR 组件(在现代 ASP.NET Core 中通常已经内置)。
在 Program.cs 中注册 SignalR:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSignalR();
var app = builder.Build();
app.MapHub<ChatHub>("/chatHub");
app.Run();
2. 创建 Hub 类
Hub 类负责处理客户端发送的消息。
using Microsoft.AspNetCore.SignalR;
public class ChatHub : Hub
{
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
}
这里实现了一个 SendMessage 方法,服务器会把消息广播给所有客户端。
3. 编写前端 JavaScript 客户端
在前端页面中引用 SignalR JS SDK:
<script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/7.0.0/signalr.min.js"></script>
然后建立连接:
const connection = new signalR.HubConnectionBuilder()
.withUrl("/chatHub")
.build();
connection.on("ReceiveMessage", (user, message) => {
console.log(user + ": " + message);
});
connection.start();
发送消息:
connection.invoke("SendMessage", "Alice", "Hello SignalR");
这样一个最基础的实时聊天功能就实现了。
SignalR 的优势与应用场景
SignalR 之所以在 .NET 生态中广受欢迎,主要有以下优势:
- 它大幅简化了实时通信开发。开发者无需直接操作 WebSocket 协议,就可以实现双向通信。
- SignalR 具备自动降级能力,可以根据客户端环境自动选择最佳通信方式,从而保证兼容性。
- 它与 ASP.NET Core 深度集成,可以直接使用依赖注入、身份认证、授权以及分布式扩展能力,使系统更容易扩展到大规模实时应用。
在实际开发中,SignalR 常见应用包括:
- 即时聊天系统
- 实时交易数据推送
- 实时通知中心
- 在线协作编辑
- 物联网设备监控
总结
.NET SignalR 是构建实时 Web 应用的重要工具,它通过 Hub 模型封装复杂的通信协议,让开发者能够轻松实现服务器与客户端之间的双向实时通信。借助 SignalR,开发者可以快速构建聊天系统、实时仪表盘、在线协作工具等应用,并且在 ASP.NET Core 的生态中获得优秀的性能与扩展能力。对于需要实时数据更新的 Web 应用来说,SignalR 是 .NET 平台最成熟、最实用的解决方案之一。