将消息包 + LZ4 压缩与 .NET Signalr 结合使用

Rez*_*zga 5 .net c# msgpack signalr asp.net-core

MessagePack for C#文档指出,使用 LZ4 压缩可以实现有效负载的紧凑二进制大小。在文档中您可以使用:

var lz4Options = MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4BlockArray);
MessagePackSerializer.Serialize(obj, lz4Options);
Run Code Online (Sandbox Code Playgroud)

所以它基本上说,在调用每个Serialize()Deserialize()方法时,您应该专门指定压缩选项。

但是,在使用.NET Signalr时,您不会直接调用这些方法。Nuget 包 Microsoft.AspNetCore.SignalR.Protocols会为您完成此操作。您只需在ConfigureServices()方法中告诉应用程序serviceCollection 执行此操作:

public void ConfigureServices(IServiceCollection services)
{
     services.AddSignalR().AddMessagePackProtocol();
}
Run Code Online (Sandbox Code Playgroud)

所以我很好奇如何为信号器指定MessagePackSerializationOptions以使用 LZ4 压缩。我已经尝试更改应用程序主要方法中的默认选项配置:

MessagePackSerializer.DefaultOptions = MessagePackSerializerOptions.Standard.WithCompression(MessagePackCompression.Lz4BlockArray);
Run Code Online (Sandbox Code Playgroud)

但首先不推荐,其次它似乎不起作用:D

Hac*_*ash 0

在 main 方法中,使用构建器模式,您需要在 lambda 表达式中指定选项。

我不知道你所说的“不推荐”是什么意思,但这是微软的实现。如果您认为他们没有遵循实施细节的最佳实践,您现在可以在他们的 GitHub 页面中向他们提出。你的语法不会改变。您只需打开该功能即可。

这是我的起始配置供参考。

轮毂侧:

builder.Services.AddSignalR(hubOptions =>
{
    hubOptions.EnableDetailedErrors = true;
})
.AddMessagePackProtocol(messagePackOptions =>
{
    messagePackOptions.SerializerOptions = MessagePackSerializerOptions.Standard
        .WithCompression(MessagePackCompression.Lz4Block)
        .WithSecurity(MessagePackSecurity.UntrustedData);
});
Run Code Online (Sandbox Code Playgroud)

客户端:

_connection = new HubConnectionBuilder()
    .WithUrl(HubUrl, options =>
    {
        // Configure authentication here:
        options.UseDefaultCredentials = true;
    })
    .AddMessagePackProtocol(options =>
    {
        options.SerializerOptions = MessagePackSerializerOptions.Standard
            .WithCompression(MessagePackCompression.Lz4Block)
            .WithSecurity(MessagePackSecurity.UntrustedData);
    })
    .ConfigureLogging(logging =>
    {
        logging.ClearProviders()
            .SetMinimumLevel(LogLevel.Debug)
            .AddFilter("Microsoft.AspNetCore.SignalR", LogLevel.Debug)
            .AddFilter("Microsoft.AspNetCore.Http.Connections", LogLevel.Debug)
            ;
    })
    .WithAutomaticReconnect()
    .Build();
Run Code Online (Sandbox Code Playgroud)