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的关系如下:

图片失效即显示

示例

准备

  1. 新建 Blazor WebAssembly Standalone App 项目
图片失效即显示
  1. 配置选项: .NET6.0框架、ASP.NET Core Hosted
图片失效即显示
  1. 安装NuGet包:Microsoft.AspNetCore.SignalR.Clent 6.0.36
图片失效即显示

实现

在 项目名.Server 应用的Porgram.cs文件中,添加如下代码:

  1. 将 SignalR 服务注册到依赖注入容器中
var builder = WebApplication.CreateBuilder(args);
    ... ...
builder.Services.AddSignalR();
    ... ...
var app = builder.Build();
  1. 在依赖容器中注册响应压缩服务
builder.Services.AddResponseCompression(opts =>
{
    opts.MimeTypes = ResponseCompressionDefaults.MimeTypes.Concat(
                new[] { "application/octet-stream" });
});

位置:在 AddSignalR() 方法之后

  1. 在 HTTP 请求管道中启用响应压缩中间件,以减少通过网络传输的数据量
var app = builder.Build();
    ... ...
app.UseResponseCompression();
    ... ...
app.Run();
  1. 将 SignalR Hub 映射到指定的路由,以便客户端通过该路由与服务器建立 SignalR 连接
app.MapControllers();
    ... ...
app.MapHub<ChatHub>("/chathub");
    ... ...
app.Run();

在项目名.Server 应用下,新建一个 xxxHub.cs 文件:

  1. 自定义 Hub,继承自 Microsoft.AspNetCore.SignalR.Hub 类
public class ChatHub : Hub
{
    // add some functions
}
  1. 添加客户端可调用的服务端方法
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,效果如下:

图片失效即显示

引用

  1. SignalR Hub协议

https://github.com/dotnet/aspnetcore/blob/main/src/SignalR/docs/specs/HubProtocol.md

  1. ASP.NET Core BlazorSignalR 指南

https://learn.microsoft.com/zh-cn/aspnet/core/blazor/fundamentals/signalr?view=aspnetcore-6.0

  1. 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)    收藏  举报