Как включить сжатие LZ4 для типа содержимого messagepack в Asp.net Core Web API

Я пытаюсь включить тип содержимого MessagePack в проекте .net Core Web API, над которым я работаю.

После некоторых исследований установил этот пакет nuget и добавил код ниже в файл запуска. Достаточно легко! Теперь я могу видеть содержимое msgpack, обслуживаемое через мои API.

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

Теперь я хотел бы применить сжатие LZ4 поверх него, чтобы уменьшить размер полезной нагрузки, как указано в здесь. И я не смог найти какие-либо пакеты nuget, чтобы добавить эту функциональность или выяснить, как подключить сжатие LZ4. В нескольких блогах я читал, что сжатие LZ4 встроено в MessagePack. Я не мог понять, что это значит, и очень мало документации по этому поводу.

Я новичок в этом сжатии/декомпрессии, поэтому любая помощь приветствуется.

Спасибо


person Naren    schedule 12.02.2019    source источник


Ответы (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);
        }
    }
person aggsol    schedule 23.04.2019
comment
Я именно так и сделал!! Спасибо за ответ. - person Naren; 15.06.2019