SignalR用法简述
SignalR 用法简述
概述
SignalR作为ASP.NET Core实时通信的核心框架,其传输协议优先级:
1. WebSocket (支持双向通信)
2. Server-Sent Events (SSE,仅服务端到客户端)
3. 长轮询 (Long Polling)
当浏览器不支持 WebSocket 或网络环境限制时会自动降级。
其 Hub 架构实现双向 RPC 调用,典型应用场景包括:
- 实时数据看板
- 多人在线协作
- 即时通讯系统
其协作流程如下:
-
客户端存根的作用:
- 参数序列化:将本地方法调用的参数转换为网络传输格式
- 网络请求发送:将序列化后的数据通过协议(如HTTP、TCP)发送到服务端
- 响应接收与反序列化:接收服务端返回的数据,反序列化为客户端可用的对象
- 错误处理:处理网络超时、连接失败等异常。
-
服务器存根的作用:
- 请求监听:接收来自客户端的网络请求。
- 参数反序列化:将接收到的数据转换为服务端方法的参数格式。
- 实际方法调用:调用服务端真正的业务逻辑方法
- 结果序列化与返回:将方法返回值序列化后发送回客户端
Hub架构工作原理:
SignalR与SignalR Hub的关系如下:
示例
准备
- 新建 Blazor WebAssembly Standalone App 项目
- 配置选项: .NET6.0框架、ASP.NET Core Hosted
实现
在 项目名.Server 应用的Porgram.cs文件中,添加如下代码:
- 将 SignalR 服务注册到依赖注入容器中
var builder = WebApplication.CreateBuilder(args);
... ...
builder.Services.AddSignalR();
... ...
var app = builder.Build();
- 在依赖容器中注册响应压缩服务
builder.Services.AddResponseCompression(opts =>
{
opts.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
new[] { "application/octet-stream" });
});
位置:在 AddSignalR() 方法之后
- 在 HTTP 请求管道中启用响应压缩中间件,以减少通过网络传输的数据量
var app = builder.Build();
... ...
app.UseResponseCompression();
... ...
app.Run();
- 将 SignalR Hub 映射到指定的路由,以便客户端通过该路由与服务器建立 SignalR 连接
app.MapControllers();
... ...
app.MapHub<ChatHub>("/chathub");
... ...
app.Run();
在项目名.Server 应用下,新建一个 xxxHub.cs 文件:
- 自定义 Hub,继承自 Microsoft.AspNetCore.SignalR.Hub 类
public class ChatHub : Hub
{
// add some functions
}
- 添加客户端可调用的服务端方法
public async Task SendMessage(string user, string message)
{
// 将消息广播给所有连接的客户端
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
在项目名.Client 应用下,新建一个xxx.razor文件:
@using Microsoft.AspNetCore.SignalR.Client
@inject NavigationManager Navigation
@messages
@code{
// Signal 连接对象
private HubConnection? hubConnention;
private string messages = string.Empty;
protected override async Task OnInitializedAsync()
{
// 构建 Signal 连接
hubConnention = new HubConnectionBuilder()
.WithUrl(Navigation.ToAbsoluteUri("/chathub"))
.Build();
// 注册接受消息的回调
hubConnention.On<string, string>("ReceiveMessage", (usr, msg) =>
{
messages = $"{usr}: {msg}";
StateHasChanged();
});
// 启动连接
await hubConnention.StartAsync();
// 消息发送
await hubConnention.SendAsync("SendMessage", "LiMing", "Hello");
}
}
启动 项目名.Server,效果如下:
引用
- SignalR Hub协议
https://github.com/dotnet/aspnetcore/blob/main/src/SignalR/docs/specs/HubProtocol.md
- ASP.NET Core BlazorSignalR 指南
https://learn.microsoft.com/zh-cn/aspnet/core/blazor/fundamentals/signalr?view=aspnetcore-6.0
- Wiki 远程过程调用 PRC
https://en.wikipedia.org/wiki/Remote_procedure_call
声明
内容准确性: 我会尽力确保所分享信息的准确性和可靠性,但由于个人知识有限,难免会有疏漏或错误。如果您在阅读过程中发现任何问题,请不吝赐教,我将及时更正。
AI: 文章部分代码、文字、流程图参考了DeepSeek大语言模型生成的内容。
代码来源: 本文档代码摘自“结合使用 ASP.NET Core SignalR 和 Blazor”章节。
posted on 2025-03-17 16:00 wubing7755 阅读(391) 评论(0) 收藏 举报
浙公网安备 33010602011771号