3

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

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

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

现在我想在它上面应用 LZ4 压缩来减少这里提到的有效载荷大小。而且我找不到任何 nuget 包来添加此功能或找出插件 LZ4 压缩的方法。在一些博客中,我读到 LZ4 压缩是内置在 MessagePack 中的。我无法理解这意味着什么,而且关于这些东西的文档很少。

我是这个压缩/解压缩的新手,所以任何帮助表示赞赏。

谢谢

4

1 回答 1

1

您必须编写自定义媒体类型格式化程序,因为压缩在不同的模块中使用。而不是MessagePackSerializer你必须使用LZ4MessagePackSerializer. 用法是一样的。推荐的 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);
        }
    }
于 2019-04-23T14:14:46.513 回答