2017-02-06 1 views
2

Ich schreibe ein. Net Web API (2), die diese eine POST-Methode haben. Diese Methode deserialisiert derzeit ihren einzigen Parameter, indem sie den Standard-JSON-Formatierer verwendet. Wir schreiben auch den Client, der diesen Api a C# -Client mit System.Net.Http.HttpClient zur Kommunikation nutzt..Net Web API 2 POST konsumieren gzip komprimierten Inhalt

Es besteht die Möglichkeit, große Datenmengen zu übertragen. Dies veranlasste uns dazu, den Footprint der Anfrage zu reduzieren.

Nach der Suche auf dieser Website stieß ich auf einige Alternativen mit Gzip-Komprimierung. Ich habe bereits ein Arbeits Proof of Concept:

  • Client-Seite etwas nach unten den Linien von this
  • Server-Seite etwas nach unten den Linien von this

Also, meine Frage ...

Muss ich wirklich all diesen benutzerdefinierten Code dafür schreiben? Gibt es einen eingebauten Weg, um den Fußabdruck der Anfrage zu verringern?

Einige Artikel, die erwähnt wurden, erwähnen die Aktivierung von gzip (oder deflate) in IIS (siehe Enable IIS7 gzip). Dies funktionierte nicht für mich (ich habe es aktiviert, ich mache immer noch die Komprimierung auf der Client-Seite, entfernt den DelegatingHandler vom Server ... aber nichts, ich habe am Ende einen Null-Parameter in der Controller-Methode)

+1

Haben Sie eine Lösung für dieses Problem gefunden? – Jerome2606

+0

Nichts aus der Box. Nach den Links, die ich in meinem Post hinzugefügt habe, habe ich einen DelegatingHandler implementiert, der die Anfragen dekomprimiert, wenn ein Content-Encoding-Header "gzip" vorhanden ist. (überschreibt SendAsync). – qazcde

Antwort

1

Ich habe schließlich einen DelegatingHandler implementiert, um mit ContentEncoding "gzip" nach einem Header zu suchen und entsprechend zu dekomprimieren.

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(); 
     } 
    } 
}