C#的SignalR是什么?如何实现Web应用的实时通信?

来源:这里教程网 时间:2026-02-21 17:30:32 作者:

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/1915" title="Summarizer"><img
                                                                                src="https://www.herecours.com/d/file/efpub/2026/21-21/20260221135728179286.jpg" alt="Summarizer"  onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
                                                                <div class="aritcle_card_info flexColumn">
                                                                        <a href="/ai/1915" title="Summarizer">Summarizer</a>
                                                                        <p>基于 AI 的文本段落摘要生成器</p>
                                                                </div>
                                                                <a href="/ai/1915" title="Summarizer" 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 需启用功能)。

相关推荐