.Net Web API 2 POST использует сжатый контент gzip

Я пишу .Net Web Api (2), у которого есть этот метод POST. В настоящее время этот метод десериализует свой единственный параметр с помощью стандартного средства форматирования JSON. Мы также пишем клиент, который будет использовать этот API-клиент C#, используя для связи System.Net.Http.HttpClient.

Существует возможность перемещения большого объема данных. Это заставило нас задуматься об уменьшении размера запроса.

После поиска на этом сайте я наткнулся на несколько альтернатив, использующих сжатие gzip. У меня уже есть рабочее доказательство концепции:

  • На стороне клиента что-то вроде этого
  • На стороне сервера что-то вроде этого

Итак, мой вопрос...

Мне действительно нужно писать весь этот пользовательский код для этого? Есть ли встроенный способ уменьшить объем запроса?

В некоторых встречавшихся статьях упоминается включение gzip (или deflate) в IIS (см. Включить gzip в IIS7). Это не сработало для меня (я включил его, я все еще выполняю сжатие на стороне клиента, удалил DelegatingHandler с сервера... но ничего, я получаю нулевой параметр в методе контроллера)


person qazcde    schedule 06.02.2017    source источник
comment
Вы нашли решение этой проблемы??   -  person Jerome2606    schedule 15.09.2017
comment
Ничего из коробки. Следуя ссылкам, которые я добавил в свой пост, я реализовал DelegatingHandler, который распаковывает запросы, если присутствует заголовок gzip, кодирующий содержимое. (перезаписывает SendAsync).   -  person qazcde    schedule 18.09.2017


Ответы (1)


В итоге я реализовал DelegatingHandler для поиска заголовка с ContentEncoding «gzip» и соответственно распаковки.

using System;
using System.Linq;
using System.Net.Http;
using System.Threading;
using System.Threading.Tasks;

namespace WebApi.MessageHandlers
{
    /// <summary>
    /// GZip message handler. 
    /// </summary>
    public class GZipMessageHandler : DelegatingHandler
    {
        protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            if (IsRequestCompressed(request))
            {
                request.Content = Descompress(request.Content);
            }
            return base.SendAsync(request, cancellationToken);
        }

        private bool IsRequestCompressed(HttpRequestMessage request)
        {
            return request.Content.Headers.ContentEncoding.Contains("gzip", StringComparer.OrdinalIgnoreCase);
        }

        private HttpContent Descompress(HttpContent content)
        {
            // Handle compression...
            throw new NotImplementedException();
        }
    }
}
person qazcde    schedule 18.09.2017