如何使用 Blazor WebAssembly 和 MessagePack 在 SignalR 中启用压缩二进制消息传递

问题描述 投票:0回答:1

您好,出色的 Blazor 和 SignalR 专家!

我的目标是通过正确配置“MessagePack”,在带有 SignalR 的 ASP.NET Core 服务器和 Blazor WebAssembly 之间添加(希望是压缩的)二进制消息传递

消息传递在两个方向上都完全可操作,但我在浏览器的网络监视器中注意到 SignalR 使用的 websocket 仍然通过 JSON 和 Base64 发送消息。我的流不仅没有按照服务器端配置进行压缩,而且 Base64 丢弃了 8 位中的 2 位,导致管道效率下降了约 28%。

据我了解,“MessagePack”协议可用于启用完整的二进制通信(删除 JSON / Base64 的使用),并且我一直在关注 https://learn.microsoft.com/en-us 上的相关文章/aspnet/core/signalr/messagepackhubprotocol

按照上述说明中的建议,这是我的服务器端 WebApplication 构建器中的当前代码:

  .AddMessagePackProtocol(options => {
    options.SerializerOptions = MessagePackSerializerOptions.Standard
      .WithResolver(MessagePack.Resolvers.StandardResolver.Instance)
      .WithSecurity(MessagePackSecurity.UntrustedData)
      .WithCompression(MessagePackCompression.Lz4Block)
      .WithCompressionMinLength(256);
    });

但是,相同的说明提到将以下内容添加到我的“.net 客户端”...

    var hubConnection = new HubConnectionBuilder()
                        .WithUrl("/chathub")
                        .AddMessagePackProtocol()
                        .Build();

不幸的是,我的 WebAssembly 工作所基于的示例没有 HubConnectionBuilder 对象的概念,并按如下方式创建其构建器:

var builder = WebAssemblyHostBuilder.CreateDefault(args);

尝试了我能想到的一切,我找不到找到“WebAssemblyHostBuilder”的子对象的方法,我可以在其中调用“AddMessagePackProtocol()”,以便 MessagePack 也可以在客户端工作

我的直觉是,服务器端已正确配置(压缩)MessagePack,但 Web 程序集客户端未正确配置,因此我仍然收到 JSON + Base64 消息传递。 (我可以在没有 MessagePack 内的压缩支持的情况下生活,但希望失去由 JSON + Base64 导致的 28% 管道效率下降)

关键问题:

  • Q1:Blazor WebAssemblies 是否支持 MessagePack?
  • Q2:什么是 在 Blazor WASM 中配置 SignalR 管道以使用 MessagePack 的正确过程?
  • Q3:MessagePack 是性能最高的管道吗? 我的客户端/服务器架构?

非常感谢您提供的任何提示!

让-皮埃尔

blazor signalr blazor-webassembly msgpack
1个回答
0
投票

感谢布伦南的精彩提示,找到了它!

出于某种原因,我只查看客户端的顶级文件,认为需要在那里配置 SignalR,因为它是在服务器端完成的。当然,初始化 SignalR 的代码位于任何需要它的给定 Razor 页面中,因此我能够按照 Microsoft 的建议完成说明,宾果游戏!

这是我的 Web 客户端 Razor 页面的 OnInitializedAsync() 中的代码(与我的服务器端相同):

    protected override async Task OnInitializedAsync() {
        g_oHubConn = new HubConnectionBuilder()
                .WithUrl(Navigation.ToAbsoluteUri("/datumhub"))
                .AddMessagePackProtocol(options => {
                    options.SerializerOptions = MessagePackSerializerOptions.Standard
                        .WithResolver(MessagePack.Resolvers.StandardResolver.Instance)
                        .WithSecurity(MessagePackSecurity.UntrustedData)
                        .WithCompression(MessagePackCompression.Lz4Block)
                        .WithCompressionMinLength(256);})
                .Build();
        more...

尽管全自动压缩很酷,但它在带宽上的效率不如使用正常的 .net Deflate 调用来压缩/解压缩自己。 (我使用 SignalR + Messagepack 得到了 2.99 X 的压缩,但使用手动调用得到了更高的 7.55 X)

感谢布伦南(Brennan)对此的提示......你摇滚老兄!

© www.soinside.com 2019 - 2024. All rights reserved.