Frage

Ich habe eine silverlight 2 beta 2-Anwendung, die auf einem WCF-web-service.Weil dieser, ist es derzeit nur verwenden können basicHttp-Bindung.Der webservice wird Rückkehr ziemlich große Mengen von XML-Daten.Dies scheint ziemlich verschwenderisch aus einer Bandbreite Standpunkt aus die Antwort, wenn RV, würde kleiner sein um einen Faktor von 5 (ich habe tatsächlich klebte die Antwort in eine txt-Datei und Zip es.).

Die Anforderung hat Sie die "Accept-Encoding:gzip, deflate" - gibt es eine Möglichkeit, die WCF-service-gzip (oder sonst komprimieren) die Reaktion?

Ich habe diese link aber sicher, es scheint ein bisschen Komplex für die Funktionalität, die behandelt werden sollten, out-of-the-box funktionieren.

OK - zuerst markierte ich die Lösung mit dem System.IO.Komprimierung als die Antwort, wie könnte ich nie "scheint", um die IIS7 dynamische Kompression zu arbeiten.Nun, wie sich herausstellt:

  1. Dynamische Kompression auf IIS7 war arbeiten, al zusammen.Es ist nur so, dass Nikhil Web-Entwickler Helper plugin für den IE nicht zeigen, dass es funktioniert.Meine Vermutung ist, dass da SL Händen die web-service-Aufruf aus dem browser, dass der browser handhabt es "unter der Haube" und Nikhil s tool sieht nie die komprimierte Antwort.Ich war in der Lage, bestätigen Sie dies mit Fiddler die der Verkehr überwacht externe zu die browser-Anwendung.In fiddler, war die Antwort, in der Tat, gzip komprimiert!!

  2. Das andere problem mit dem System.IO.Komprimierung Lösung ist, dass System.IO.Komprimierung nicht vorhanden in der Silverlight-CLR.

Also aus meiner Sicht ist die EINFACHSTE Möglichkeit zum aktivieren von WCF-Kompression in Silverlight ist zum aktivieren der Dynamischen Kompression in IIS7 und schreiben überhaupt keinen code.

War es hilfreich?

Lösung

Wenn Sie mit IIS7, werfen Sie einen Blick auf die Compression-Modul.Dies ermöglicht Ihnen die Konfiguration der Komprimierung für die HTTP-Anforderungen an Ihren server.

Andere Tipps

WS-Komprimierung für die WCF ermöglicht Ihnen die Konfiguration der Komprimierung auf die Bindung.

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

Alternativ, versuchen Sie, Microsoft GZip-Encoder, Sample die "schafft eine encoder-Kanal, der das System nutzt.IO.Kompression.GZipStream-Klasse zu komprimieren ausgehende WCF-Nachrichten"

Ich wollte nicht sehen, einen einheitlichen Weg für WCF zu tun, Kompression, wenn dabei ein WCF-Projekt vor kurzem.Ich habe gerade das System.IO.Compression-namespace und machte eine schnelle compressor.Hier ist der code, den ich verwendet

public static class CompressedSerializer
{
    /// <summary>
    /// Decompresses the specified compressed data.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="compressedData">The compressed data.</param>
    /// <returns></returns>
    public static T Decompress<T>(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;
    }

    /// <summary>
    /// Compresses the specified data.
    /// </summary>
    /// <typeparam name="T"></typeparam>
    /// <param name="data">The data.</param>
    /// <returns></returns>
    public static byte[] Compress<T>(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 hatte ich gerade meine Dienste nehmen, in ein byte-array als Eingabe, wie Z

void ReceiveData(byte[] data);

Funktioniert gut für mich.

Es sollte auch darauf hingewiesen werden, dass möglicherweise müssen Sie fügen Sie den mime-Typ zu applicationHost.config unter <httpCompression><dynamicTypes> Abschnitt neben der Aktivierung der Komprimierung für die Website:

<add mimeType="application/soap+msbin1" enabled="true" />

Wenn bestimmte dynamische Antworten nicht komprimiert (und einige sind), könnte es eine mime-Typ-Frage.Verwenden Sie Fiddler, um die Besonderheiten im Zusammenhang mit der Anfrage.Ablaufverfolgung für anforderungsfehler kann hilfreich sein bei der Bestimmung, ob oder nicht Sie IIS ist auch der Versuch der Kompression die Antwort.Wenn die Komprimierung korrekt konfiguriert ist, sehen Sie eine NO_MATCHING_CONTENT_TYPE in der trace complete Abschnitt der trace-Ausgabe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top