C# SignalR使用方法 C#如何实现实时通信

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

SignalR 是什么,什么时候该用它

SignalR 是 .NET 平台上的实时通信库,本质是自动在 WebSocket、Server-Sent Events、长轮询之间做降级选择。它不是“必须用 WebSocket 才算实时”,而是帮你屏蔽传输细节,专注业务逻辑。如果你需要服务端主动推数据(比如聊天、通知、仪表盘刷新),又不想自己维护连接心跳、重连、分组广播这些逻辑,SignalR 就是合理选择。

注意:它不适用于高吞吐低延迟的场景(如高频交易),也不适合纯客户端点对点通信(该用 WebRTC)。

服务端配置:Startup.cs 或 Program.cs 中启用 SignalR

在 .NET 6+ 的

Program.cs
中,需注册 Hub 服务并映射路由:

builder.Services.AddSignalR();
// ... 其他服务
app.MapHub<ChatHub>("/hub/chat");

其中

ChatHub
是继承自
Hub
的类,路径
/hub/chat
就是客户端连接的目标地址。别漏掉
AddSignalR()
,否则运行时会报
InvalidOperationException: No service for type 'Microsoft.AspNetCore.SignalR.IHubContext`1[...]'

常见疏忽:

Hub 类没加 public 访问修饰符 → 客户端调用方法时静默失败 映射路径和前端连接 URL 不一致(比如写成
/chat
却在 JS 里连
/hub/chat
)→ 连接 404
在 IIS 部署时未启用 WebSocket 支持 → 自动降级到长轮询,但延迟明显升高

客户端连接与调用:JavaScript 端怎么写

用官方

@microsoft/signalr
包,不能直接 fetch 或 axios:

const connection = new signalR.HubConnectionBuilder()
  .withUrl("/hub/chat")
  .configureLogging(signalR.LogLevel.Information)
  .build();
<p>await connection.start(); // 必须 await,否则后续调用可能失败</p><div class="aritcle_card flexRow">
                                                        <div class="artcardd flexRow">
                                                                <a class="aritcle_card_img" href="/xiazai/learn/2593" title="动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版"><img
                                                                                src="https://www.herecours.com/d/file/efpub/2026/21-21/20260221140417179529.jpg" alt="动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版"  onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
                                                                <div class="aritcle_card_info flexColumn">
                                                                        <a href="/xiazai/learn/2593" title="动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版">动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版</a>
                                                                        <p>动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包</p>
                                                                </div>
                                                                <a href="/xiazai/learn/2593" title="动态WEB网站中的PHP和MySQL:直观的QuickPro指南第2版" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
                                                        </div>
                                                </div><p>connection.on("ReceiveMessage", (user, message) => {
console.log(<code>${user}: ${message}</code>);
});</p><p>await connection.invoke("SendMessage", "Alice", "Hello");

关键点:

invoke
用于调用服务端方法,返回 Promise;
on
用于监听服务端推送的方法名,大小写必须和服务端
Client
方法签名完全一致
服务端若用
await Clients.All.SendAsync("ReceiveMessage", ...)
推送,客户端必须已注册
connection.on("ReceiveMessage", ...)
,否则消息丢弃无提示
连接中断后不会自动重连(除非显式调用
withAutomaticReconnect()

C# 客户端调用 Hub:比如 Windows 服务或控制台程序

Microsoft.AspNetCore.SignalR.Client
NuGet 包:

var connection = new HubConnectionBuilder()
  .WithUrl("https://localhost:5001/hub/chat")
  .Build();
<p>connection.On<string, string>("ReceiveMessage", (user, msg) => Console.WriteLine($"{user}: {msg}"));</p><p>await connection.StartAsync();</p><p>await connection.InvokeAsync("SendMessage", "Bob", "Hi from console");

注意:

控制台程序需用
async Main
,否则
await connection.StartAsync()
无法执行
证书问题:若服务端用 HTTPS + 自签名证书,C# 客户端需配置
.AddHttpClient().ConfigurePrimaryHttpMessageHandler(() => new HttpClientHandler { ServerCertificateCustomValidationCallback = (_, _, _, _) => true })
服务端方法参数类型要和客户端传入的严格匹配,比如传
int
却定义为
long
→ 调用静默失败,日志只显示“Failed to invoke”

Hub 方法的复杂对象序列化依赖 System.Text.Json,默认不支持字段、私有 set、循环引用——这些地方最容易出无声故障。

相关推荐