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;public class ChatHub : Hub{public async Task SendMessage(string user, string message){await Clients.All.SendAsync("ReceiveMessage", user, message);}}
这个 Hub 定义了一个 SendMessage 方法,当被调用时,会通过 Clients.All.SendAsync 向所有连接的客户端广播消息,并触发客户端的 ReceiveMessage 方法。
2. 配置 Startup 或 Program 文件
在 Program.cs 中注册 SignalR 服务并映射 Hub 路由。
var builder = WebApplication.CreateBuilder(args);// 添加 SignalR 服务builder.Services.AddSignalR();
var app = builder.Build();
app.UseRouting();
// 映射 Hub,注意路径要匹配前端请求app.MapHub("/chathub");
app.Run();
3. 前端页面使用 JavaScript 连接
在 HTML 页面中引入 SignalR 客户端库,并建立连接。
const connection = new signalR.HubConnectionBuilder() .withUrl("/chathub") .build();// 接收服务器推送的消息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 _hubContext;public NotifyController(IHubContext hubContext){ _hubContext = hubContext;}[HttpGet("send")]public async Task Get(){ await _hubContext.Clients.All.SendAsync("ReceiveMessage", "System", "有新通知!");}
}
这样,访问 /notify/send 就能触发实时消息推送。
基本上就这些。SignalR 简化了实时通信的复杂性,让 C# 开发者能快速构建响应迅速的 Web 应用。只要定义好 Hub 和前后端方法名,就能实现服务器推和客户端调用,不复杂但容易忽略大小写和路由匹配问题。部署时注意服务器要支持 WebSocket(如 IIS 需启用功能)。
以上就是C#的SignalR是什么?如何实现Web应用的实时通信?的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1441651.html
微信扫一扫
支付宝扫一扫