24 Stimmen

Was ist der einfachste Weg, um Komprimierung zu WCF in Silverlight hinzuzufügen?

Ich habe eine Silverlight 2 Beta 2-Anwendung, die auf einen WCF-Webservice zugreift. Aufgrund dessen kann sie derzeit nur basicHttp-Bindung verwenden. Der Webservice wird relativ große Mengen an XML-Daten zurückgeben. Dies scheint aus Bandbreitennutzungsgründen ziemlich verschwenderisch zu sein, da die Antwort, wenn sie komprimiert wäre, um den Faktor 5 kleiner wäre (ich habe die Antwort tatsächlich in eine Textdatei eingefügt und sie komprimiert).

Die Anforderung enthält "Accept-Encoding: gzip, deflate" - Gibt es eine Möglichkeit, den WCF-Service dazu zu bringen, die Antwort zu komprimieren (oder anderweitig zu komprimieren)?

Ich habe diesen Link gefunden, aber es scheint ziemlich komplex für eine Funktionalität zu sein, die meiner Meinung nach out-of-the-box behandelt werden sollte.

OK - zuerst habe ich die Lösung mit der Verwendung von System.IO.Compression als Antwort markiert, da ich nie "scheine", die dynamische Komprimierung von IIS7 zum Laufen zu bringen. Nun, wie sich herausstellte:

  1. Die dynamische Komprimierung auf IIS7 hat die ganze Zeit funktioniert. Es ist nur so, dass Nikhils Web Developer Helper-Plugin für den IE es nicht funktionieren zeigte. Meine Vermutung ist, dass, da SL den Webservice-Aufruf an den Browser übergibt, der Browser es "im Hintergrund" behandelt und das Tool von Nikhil die komprimierte Antwort nie sieht. Ich konnte dies bestätigen, indem ich Fiddler benutzte, der den Verkehr außerhalb der Browseranwendung überwacht. In Fiddler war die Antwort tatsächlich gzip-komprimiert!!

  2. Das andere Problem mit der Lösung mit System.IO.Compression ist, dass System.IO.Compression nicht im Silverlight CLR existiert.

Also aus meiner Sicht ist der EINFACHSTE Weg, die WCF-Komprimierung in Silverlight zu aktivieren, die Aktivierung der dynamischen Komprimierung in IIS7 und überhaupt keinen Code zu schreiben.

0 Stimmen

Die dynamische Kompression funktioniert nur für einige Anfragen (d. h. diejenigen, die von IIS als häufig aufgerufen eingestuft werden). Es ist also eine nette Funktion, aber du hast keine Kontrolle darüber. Ich habe einen wirklich großen Aufruf, wenn sich ein Benutzer anmeldet, aber das geschieht nur einmal am Tag und er wird nicht komprimiert.

12voto

Daniel Ballinger Punkte 12389

WS-Komprimierung für WCF ermöglicht es Ihnen, die Komprimierung am Binding zu konfigurieren.

Siehe WS-Komprimierung für WCF von Pablo M. Cibraro

Alternativ können Sie das GZip Encoder Beispiel von Microsoft ausprobieren, das "einen Encoder-Kanal erstellt, der die Klasse System.IO.Compression.GZipStream verwendet, um ausgehende WCF-Nachrichten zu komprimieren"

11voto

Darren Kopp Punkte 74401

Ich habe keinen nativen Weg für WCF gesehen, um Komprimierung zu machen, als ich kürzlich an einem WCF-Projekt gearbeitet habe. Ich habe einfach den Namespace System.IO.Compression verwendet und einen schnellen Kompressor erstellt. Hier ist der Code, den ich verwendet habe

public static class CompressedSerializer
{
    /// 
    /// Entpackt die angegebenen komprimierten Daten.
    /// 
    /// 
    /// Die komprimierten Daten.
    /// 
    public static T Decompress(byte[] compressedData) where T : class
    {
        T result = null;
        using (MemoryStream memory = new MemoryStream())
        {
            memory.Write(compressedData, 0, compressedData.Length);
            memory.Position = 0L;

            using (GZipStream zip= new GZipStream(memory, CompressionMode.Decompress, true))
            {
                zip.Flush();
                var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                result = formatter.Deserialize(zip) as T;
            }
        }

        return result;
    }

    /// 
    /// Komprimiert die angegebenen Daten.
    /// 
    /// 
    /// Die Daten.
    /// 
    public static byte[] Compress(T data)
    {
        byte[] result = null;
        using (MemoryStream memory = new MemoryStream())
        {
            using (GZipStream zip= new GZipStream(memory, CompressionMode.Compress, true))
            {
                var formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
                formatter.Serialize(zip, data);
            }

            result = memory.ToArray();
        }

        return result;
    }
}

Dann habe ich einfach meinen Services ein Byte-Array als Eingabe übergeben lassen, wie zum Beispiel

void ReceiveData(byte[] data);

Hat gut für mich funktioniert.

10voto

Lance Fisher Punkte 25464

Wenn Sie IIS7 verwenden, werfen Sie einen Blick auf das Komprimierungsmodul. Dies ermöglicht es Ihnen, die Komprimierung für HTTP-Anfragen an Ihren Server zu konfigurieren.

3voto

Mike H. Punkte 31

Es sollte auch beachtet werden, dass Sie möglicherweise den MIME-Typ zu applicationHost.config unter dem Abschnitt hinzufügen müssen, um die Komprimierung für die Website zu aktivieren:

Wenn bestimmte dynamische Antworten nicht komprimiert werden (und einige sind), könnte es sich um ein MIME-Typ-Problem handeln. Verwenden Sie Fiddler, um die Einzelheiten zu ermitteln, die mit der Anforderung verbunden sind. Das Tracking fehlgeschlagener Anforderungen kann bei der Feststellung nützlich sein, ob IIS überhaupt versucht, die Antwort zu komprimieren. Wenn die Komprimierung korrekt konfiguriert ist, sehen Sie ein NO_MATCHING_CONTENT_TYPE im Abschnitt vollständige Spur der Trace-Ausgabe.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X