如何在 Asp.net Core Web API 中为消息包内容类型启用 LZ4 压缩

How to enable LZ4 compression for messagepack content type in Asp.net Core Web API

我正在尝试在我正在处理的 .net Core Web API 项目上启用 MessagePack 内容类型。

经过一些研究,安装了这个 nuget 包并在启动文件中添加了以下代码。很简单!现在我可以看到通过我的 APIs 提供的 msgpack 内容。

services.AddMvc().AddMessagePackFormatters(c => 
{
  c.FormatterResolver = ContractlessStandardResolver.Instance;
  c.SupportedContentTypes.Add("application/x-msgpack");
  c.SupportedExtensions.Add("mp");
});

现在我想在其上应用 LZ4 压缩以减小 here 中提到的有效负载大小。而且我找不到任何 nuget 包来添加此功能或找出插入 LZ4 压缩的方法。在一些博客中,我了解到 MessagePack 中内置了 LZ4 压缩。我不明白那是什么意思,而且关于这些东西的文档很少。

我是这个 compression/de-compression 方面的新手,所以非常感谢您的帮助。

谢谢

您必须编写自定义媒体类型格式化程序,因为压缩用于不同的模块。您必须使用 LZ4MessagePackSerializer 而不是 MessagePackSerializer。用法是一样的。另外推荐的 MIME 类型是 application/msgpack.

查看这个基本示例:

    public class MsgPackMediaTypeFormatter: BufferedMediaTypeFormatter
    {
        public MsgPackMediaTypeFormatter()
        {
            SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/msgpack"));
        }

        public override bool CanReadType(Type type)
        {
            return !type.IsAbstract && !type.IsInterface && type.IsPublic;
        }

        public override bool CanWriteType(Type type)
        {
            return !type.IsAbstract && !type.IsInterface && type.IsPublic;
        }

        public override object ReadFromStream(Type type, Stream readStream, HttpContent content, IFormatterLogger formatterLogger)
        {
            return LZ4MessagePackSerializer.NonGeneric.Deserialize(type, readStream);
        }

        public override void WriteToStream(Type type, object value, Stream writeStream, HttpContent content)
        {
            LZ4MessagePackSerializer.NonGeneric.Serialize(type, writeStream, value, MessagePack.Resolvers.ContractlessStandardResolver.Instance);
        }
    }