Quel est le moyen le plus simple d'ajouter de la compression à WCF dans Silverlight?

J'ai une application silverlight 2 beta 2 qui accède à un service web WCF. Pour cette raison, il ne peut actuellement utiliser que la liaison basicHttp. Le webservice retournera des quantités assez importantes de données XML. Cela semble assez inutile du point de vue de l'utilisation de la bande passante car la réponse, si elle est compressée, serait plus petite d'un facteur 5 (j'ai effectivement collé la réponse dans un fichier txt et l'ai compressée.).

La requête a le "Accept-Encoding: gzip, deflate" - est-il possible d'avoir le WCF service gzip (ou autrement compresser) la réponse?

J'ai trouvé ce lien mais cela semble un peu complexe pour les fonctionnalités qui devraient être gérées à mon humble avis.

OK-au début, j'ai marqué la solution en utilisant le System. IO. Compression comme réponse car je ne pouvais jamais "sembler" faire fonctionner la compression dynamique IIS7. Eh bien, comme il s'avère:

  1. La Compression dynamique sur IIS7 fonctionnait al le long de. C'est juste que le Web de Nikhil Le plugin Developer Helper pour IE ne l'a pas montré fonctionner. Je suppose que puisque SL remet l'appel du service web au navigateur, le navigateur le gère "sous les couvertures" et l'outil de Nikhil ne voit jamais la réponse compressée. J'ai pu le confirmer en utilisant Fiddler qui surveille le trafic externe à l'application du navigateur. Dans fiddler, la réponse était, en fait, gzip compressé!!

  2. L'autre problème avec la solution System.IO.Compression est que System. IO. Compression n'existe pas dans le CLR Silverlight.

Donc, de mon point de vue, le moyen le plus simple d'activer la compression WCF dans Silverlight est d'activer la Compression dynamique dans IIS7 et d'écrire aucun code.

23
demandé sur Drew Noakes 2008-08-13 20:08:43

4 réponses

Si vous utilisez IIS7, jetez un oeil au module de Compression . Cela vous permet de configurer la compression des requêtes HTTP sur votre serveur.

10
répondu Lance Fisher 2008-08-13 18:22:03

WS-Compression pour WCF vous permet de configurer la compression sur la liaison.

Voir WS-Compression pour WCF par Pablo M. Cibraro

Sinon, essayez Microsofts gzip Encoder Sample qui "crée un canal d'encodeur qui utilise la classe System. IO. Compression. GZipStream pour compresser les messages WCF sortants"

12
répondu Daniel Ballinger 2015-01-30 15:43:37

Je n'ai pas vu de moyen natif pour que WCF fasse de la compression lors d'un projet WCF récemment. Je viens d'utiliser L'espace de noms System.IO.Compression et fait un compresseur rapide. Voici le code que j'ai utilisé

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

Ensuite, j'ai juste demandé à mes services de prendre un tableau d'octets en entrée, comme tel

void ReceiveData(byte[] data);

A bien Fonctionné pour moi.

11
répondu Darren Kopp 2008-08-13 16:28:06

Il convient également de noter que vous devrez peut-être ajouter le type mime à applicationHost.config sous la section <httpCompression><dynamicTypes> en plus d'activer la compression pour le site:

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

Si certaines réponses dynamiques ne sont pas compressées (et certaines le sont), il peut s'agir d'un problème de type mime. Utilisez Fiddler pour obtenir les détails associés à la demande. L'échec du traçage des requêtes peut être utile pour déterminer si IIS tente même de compresser la réponse. Si la compression est correctement configurée vous voir un NO_MATCHING_CONTENT_TYPE dans le complète trace section de la sortie de trace.

3
répondu Mike H. 2017-04-28 13:55:16