Как включить сжатие LZ4 для типа содержимого пакета сообщений в Asp.net Core Web API - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь включить тип содержимого 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.Я не мог понять, что это значит, и там очень мало документации об этом материале.

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

Спасибо

1 Ответ

0 голосов
/ 23 апреля 2019

Вы должны написать пользовательский форматтер медиа-типа, потому что сжатие используется в другом модуле.Вместо 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);
        }
    }
...