Vra

Ek het 'n Silverlight 2 beta 2-toepassing wat toegang tot 'n WCF-webdiens verkry.As gevolg hiervan kan dit tans slegs basieseHttp-binding gebruik.Die webdiens sal redelik groot hoeveelhede XML-data terugstuur.Dit lyk taamlik verkwistend vanuit 'n bandwydte gebruik oogpunt aangesien die reaksie, indien gerits, kleiner sou wees met 'n faktor van 5 (ek het eintlik die antwoord in 'n txt-lêer geplak en dit gezip.).

Die versoek het wel die "Aanvaar-enkodering:gzip, deflate" - Is daar enige manier om die WCF-diens gzip (of andersins saamgepers) die reaksie te hê?

Ek het dit gevind skakel maar dit lyk sekerlik 'n bietjie kompleks vir funksionaliteit wat buite die boks IMHO hanteer moet word.

OK - ek het eers die oplossing gemerk deur die System.IO.Compression as die antwoord te gebruik aangesien ek nooit kon "lyk" om die IIS7 dinamiese kompressie te laat werk nie.Wel, soos dit blyk:

  1. Dinamiese kompressie op IIS7 was werk al saam.Dit is net dat Nikhil se Web Developer Helper-inprop vir IE nie gewys het dat dit werk nie.My raaiskoot is dat aangesien SL die webdiensoproep aan die blaaier oorhandig, dat die blaaier dit "onder die dekmantels" hanteer en Nikhil se instrument sien nooit die saamgeperste reaksie nie.Ek kon dit bevestig deur Fiddler te gebruik wat verkeer buite die blaaiertoepassing monitor.In fiddler was die reaksie in werklikheid gzip saamgepers!!

  2. Die ander probleem met die System.IO.Compression-oplossing is dat System.IO.Compression nie in die Silverlight CLR bestaan ​​nie.

So vanuit my perspektief is die MAKLIKSTE manier om WCF-kompressie in Silverlight te aktiveer, om dinamiese kompressie in IIS7 te aktiveer en geen kode te skryf nie.

Was dit nuttig?

Oplossing

As jy IIS7 gebruik, kyk na die Kompressie module.Dit laat jou toe om kompressie vir HTTP-versoeke na jou bediener op te stel.

Ander wenke

WS-Compression for WCF laat jou toe om kompressie op die binding op te stel.

Sien WS-kompressie vir WCF deur Pablo M.Cibraro

Alternatiewelik, probeer Microsofts GZip Encoder Voorbeeld wat "'n enkodeerderkanaal skep wat die System.IO.Compression.GZipStream-klas gebruik om uitgaande WCF-boodskappe saam te pers"

Ek het nie 'n inheemse manier vir WCF gesien om kompressie te doen toe ek onlangs 'n WCF-projek gedoen het nie.Ek het net die System.IO.Compression naamruimte gebruik en 'n vinnige kompressor gemaak.Hier is die kode wat ek gebruik het

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

dan het ek net my dienste laat inneem 'n grepe-skikking as 'n invoer, soos so

void ReceiveData(byte[] data);

Het goed uitgewerk vir my.

Daar moet ook kennis geneem word dat jy dalk die mimiektipe by moet voeg applicationHost.config onder <httpCompression><dynamicTypes> afdeling benewens om kompressie vir die webwerf moontlik te maak:

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

As sekere dinamiese response nie saamgepers word nie (en sommige word), kan dit 'n mimiektipe-probleem wees.Gebruik Fiddler om die besonderhede te kry wat met die versoek geassosieer word.Mislukte versoekopsporing kan nuttig wees om te bepaal of IIS selfs probeer om die reaksie saam te druk of nie.As kompressie korrek opgestel is, sal jy 'n sien NO_MATCHING_CONTENT_TYPE in die volledige spoor gedeelte van die spooruitset.

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top