2017-02-06 7 views
2

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

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

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

  • стороны клиента что-то вниз по линии this
  • стороны сервера что-то вниз по линии this

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

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

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

+1

Вы нашли решение этой проблемы? – Jerome2606

+0

Ничего из коробки. После ссылок, которые я добавил в своем сообщении, я завершил реализацию DelegatingHandler, который распаковывает запросы, если присутствует заголовок содержимого gzip. (перезаписывает SendAsync). – qazcde

ответ

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(); 
     } 
    } 
} 
Смежные вопросы