signalr 实现 asp.net core 实时通信,通过 hub 类处理连接与消息广播,如 sendmessage 方法调用 clients.all.sendasync 向所有客户端推送;在 program.cs 中添加 addsignalr 和 maphub 配置路由;前端引入 signalr.min.js,使用 hubconnectionbuilder 连接 /chathub,调用 connection.on 接收消息,invoke 发送;还可通过 ihubcontext 在控制器中主动推送,如 notifycontroller 调用 _hubcontext.clients.all.sendasync 触发通知。

SignalR 是 ASP.NET Core 提供的一个库,用于在 Web 应用中实现**实时双向通信**。传统的 HTTP 请求是客户端发起、服务器响应的模式,而 SignalR 让服务器可以主动向客户端推送数据,适用于聊天应用、实时通知、仪表盘更新等场景。
它自动选择最佳通信方式,支持以下几种底层传输协议:
- WebSockets:性能最好,全双工通信,优先使用
- Server-Sent Events
- 长轮询(Long Polling)
开发者无需关心底层细节,SignalR 会根据浏览器和服务器环境自动协商。
如何使用 SignalR 实现 Web 实时通信?
下面是一个简单的示例,展示如何在 C# 的 ASP.NET Core Web 应用中使用 SignalR 实现客户端与服务器之间的实时消息传递。
1. 创建 Hub 类(服务端核心)
Hub 是 SignalR 的中心类,负责处理客户端连接、方法调用和消息广播。
using Microsoft.AspNetCore.SignalR;
<p>public class ChatHub : Hub
{
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
}</p>这个 Hub 定义了一个 SendMessage 方法,当被调用时,会通过 Clients.All.SendAsync 向所有连接的客户端广播消息,并触发客户端的 ReceiveMessage 方法。
2. 配置 Startup 或 Program 文件
在 Program.cs 中注册 SignalR 服务并映射 Hub 路由。
var builder = WebApplication.CreateBuilder(args);
<p>// 添加 SignalR 服务
builder.Services.AddSignalR();</p><p>var app = builder.Build();</p><div class="aritcle_card flexRow">
<div class="artcardd flexRow">
<a class="aritcle_card_img" href="/ai/762" title="百宝箱"><img
src="https://img.php.cn/upload/ai_manual/000/000/000/175679962759206.png" alt="百宝箱" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a href="/ai/762" title="百宝箱">百宝箱</a>
<p>百宝箱是支付宝推出的一站式AI原生应用开发平台,无需任何代码基础,只需三步即可完成AI应用的创建与发布。</p>
</div>
<a href="/ai/762" title="百宝箱" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
</div>
</div><p>app.UseRouting();</p><p>// 映射 Hub,注意路径要匹配前端请求
app.MapHub<ChatHub>("/chathub");</p><p>app.Run();</p>3. 前端页面使用 JavaScript 连接
在 HTML 页面中引入 SignalR 客户端库,并建立连接。
<script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/6.0.1/signalr.min.js"></script>
<script>
const connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.build();
<pre class='brush:php;toolbar:false;'>// 接收服务器推送的消息
connection.on("ReceiveMessage", function (user, message) {
const msg = document.createElement("div");
msg.textContent = `${user}: ${message}`;
document.getElementById("messages").appendChild(msg);
});
// 启动连接
connection.start().catch(err => console.error(err));
// 发送消息到服务器
function sendMessage() {
const user = document.getElementById("user").value;
const message = document.getElementById("message").value;
connection.invoke("SendMessage", user, message).catch(err => console.error(err));
}4. 可选:从控制器主动推送消息
如果想在某个 API 控制器中主动通知所有用户,可以通过 IHubContext 实现。
[ApiController]
[Route("[controller]")]
public class NotifyController : ControllerBase
{
private readonly IHubContext<ChatHub> _hubContext;
<pre class='brush:php;toolbar:false;'>public NotifyController(IHubContext<ChatHub> hubContext)
{
_hubContext = hubContext;
}
[HttpGet("send")]
public async Task Get()
{
await _hubContext.Clients.All.SendAsync("ReceiveMessage", "System", "有新通知!");
}}
这样,访问 /notify/send 就能触发实时消息推送。
基本上就这些。SignalR 简化了实时通信的复杂性,让 C# 开发者能快速构建响应迅速的 Web 应用。只要定义好 Hub 和前后端方法名,就能实现服务器推和客户端调用,不复杂但容易忽略大小写和路由匹配问题。部署时注意服务器要支持 WebSocket(如 IIS 需启用功能)。









