Anfragen von Angular an Web API komprimieren [geschlossen]

8

Ich versuche, die Bandbreitennutzung zu optimieren, indem ich Anfragen von meinem eckigen Client an eine AspNet Web API komprimiere. Gibt es einen Weg, dies zu erreichen?

    
Abhijeet 13.12.2015, 13:54
quelle

1 Antwort

9

Eine Möglichkeit ist die Verwendung von Industriestandard-Algorithmen zur Komprimierung von Daten wie gzip . Sie bieten eine sehr gute Komprimierung für rohe Zeichenketten und wenn Sie große Objekte an den Server senden, können Sie auf jeden Fall die Leistung steigern, indem Sie die Größe Ihrer Anfragen reduzieren. Ganz zu schweigen von den Vorteilen, die Sie erzielen, wenn Ihre App auf Mobilgeräten mit begrenzter Bandbreite ausgeführt wird.

Aber genug von Chattering, lasst uns üben. Die größte Herausforderung besteht darin, eine gültige gzip Anfrage in Javascript zu generieren. Eine Möglichkeit besteht darin, die Spezifikation dieses Formats zu lesen und eine eigene Implementierung zu erstellen oder eine vorhandene Bibliothek zu verwenden. Eine, die ich besonders interessant finde, ist pako .

Es ist trivial, in Ihrer Anwendung mit bower zu installieren, indem Sie einfach den folgenden Befehl ausgeben:

%Vor%

Sehen wir uns nun an, wie eine Beispielanforderung aus der Clientperspektive aussehen würde. Angenommen, Sie möchten das folgende JSON an den Server senden (entweder als POST- oder als PUT-Verben):

%Vor%

Das erreichen Sie genauso einfach wie mit dem einfachen XMLHttpRequest -Objekt, das in modernen Browsern verfügbar ist (lesen Sie weiter unten, wenn Sie an einer Angular-spezifischen Lösung interessiert sind):

%Vor%

Da Sie nach einer Angular-Anfrage gefragt haben, lassen Sie uns diese Beispiel-AJAX-Anfrage mithilfe der nativen $http Objekt:

%Vor%

OK, im Grunde haben wir jetzt den clientseitigen Senderteil behandelt, der eine AJAX-Anfrage verwendet und den richtigen Content-Encoding-Anfrage-Header spezifiziert.

Nun beschäftigen wir uns mit dem Server-Side-Part. Angenommen, Sie verwenden das Web-API 2, das in IIS gehostet wird.

Sie haben also eine Startup -Klasse in Ihrer ASP.NET-Anwendung, die Ihre Web-API bootstrappt:

%Vor%

und dann haben Sie offensichtlich ein View-Modell, um Ihre Payload zu mappen:

%Vor%

und ein Web-API-Controller, der den Zweck eines serverseitigen Handlers Ihrer AJAX-Anfragen erfüllt:

%Vor%

So weit, so gut. Leider unterstützt die Web-API die gzip -Anforderungscodierung nicht standardmäßig. Aber da dies ein ziemlich erweiterbares Framework ist, müssen Sie nur einen benutzerdefinierten delegierenden Handler schreiben, der weiß, wie die vom Client kommende Anfrage entpackt wird.

Beginnen wir mit dem Schreiben eines benutzerdefinierten HttpContent:

%Vor%

und dann unser delegierender Handler:

%Vor%

Jetzt müssen Sie nur noch diesen benutzerdefinierten Handler in unserer Klasse Startup registrieren:

%Vor%

Und das ist es ziemlich. Wenn nun die Aktion TestController.Post von der AJAX-Anforderung auf der Clientseite aufgerufen wird, enthält der Eingabebody die richtigen Header, und unser delegierender Handler kümmert sich um die Decodierung, so dass Sie beim Abrufen der Post-Aktion das erwartete Ansichtsmodell bereits deserialisiert erhalten .

Zur Erinnerung: Sie sollten sich bewusst sein, dass Sie bei kleinen Anfragen wie dem in diesem Beispiel wahrscheinlich nicht viel mit gzip gewinnen werden - Sie könnten die Dinge sogar noch verschlimmern, weil die gzip - Zahlen dem Nutzlast. Aber für größere Anfragen wird dieser Ansatz definitiv dazu beitragen, die Größe Ihrer Anfragen zu reduzieren und ich empfehle Ihnen dringend, gzip zu verwenden.

Und hier ist das Ergebnis dieser Bemühungen:

    
Darin Dimitrov 13.12.2015, 14:51
quelle

Tags und Links