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 让服务器可以主动向客户端推送数据,适用于聊天应用、实时通知、仪表盘更新等场景。
它自动选择最佳通信方式,支持以下几种底层传输协议:
开发者无需关心底层细节,SignalR 会根据浏览器和服务器环境自动协商。
下面是一个简单的示例,展示如何在 C# 的 ASP.NET Core Web 应用中使用 SignalR 实现客户端与服务器之间的实时消息传递。
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 方法。
在 Program.cs 中注册 SignalR 服务并映射 Hub 路由。
var builder = WebApplication.CreateBuilder(args);
<p>// 添加 SignalR 服务
builder.Services.AddSignalR();</p><p>var app = builder.Build();</p><p>app.UseRouting();</p>
<div class="aritcle_card">
<a class="aritcle_card_img" href="/ai/950">
<img src="https://img.php.cn/upload/ai_manual/000/000/000/175680003823895.png" alt="ViiTor实时翻译">
</a>
<div class="aritcle_card_info">
<a href="/ai/950">ViiTor实时翻译</a>
<p>AI实时多语言翻译专家!强大的语音识别、AR翻译功能。</p>
<div class="">
<img src="/static/images/card_xiazai.png" alt="ViiTor实时翻译">
<span>116</span>
</div>
</div>
<a href="/ai/950" class="aritcle_card_btn">
<span>查看详情</span>
<img src="/static/images/cardxiayige-3.png" alt="ViiTor实时翻译">
</a>
</div>
<p>// 映射 Hub,注意路径要匹配前端请求
app.MapHub<ChatHub>("/chathub");</p><p>app.Run();</p>在 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));
}</script>
如果想在某个 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 需启用功能)。
以上就是C#的SignalR是什么?如何实现Web应用的实时通信?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号