Question

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 service Web renverra 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 était compressée, serait plus petite d'un facteur 5 (j'ai en fait collé la réponse dans un fichier txt et l'ai compressée.).

La requête a le "Accept-Encoding :gzip, deflate" - Existe-t-il un moyen pour le service WCF de gzip (ou de compresser autrement) la réponse ?

j'ai trouvé ça lien mais cela semble certainement un peu complexe pour des fonctionnalités qui devraient être gérées immédiatement à mon humble avis.

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

  1. Compression dynamique sur IIS7 était travailler tout le long.C'est juste que le plugin Web Developer Helper de Nikhil pour IE ne l'a pas montré fonctionnant.Je suppose que puisque SL confie l'appel du service Web au navigateur, celui-ci 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, compressée par gzip !!

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

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 de n'écrire aucun code.

Était-ce utile?

La solution

Si vous utilisez IIS7, jetez un œil au Module de compression.Cela vous permet de configurer la compression des requêtes HTTP vers votre serveur.

Autres conseils

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

Voir Compression WS pour WCF par Pablo M.Cibraro

Sinon, essayez Microsoft Exemple d'encodeur GZip qui "crée un canal d'encodeur qui utilise la classe System.IO.Compression.GZipStream pour compresser les messages WCF sortants"

Je n'ai pas vu de moyen natif permettant à WCF d'effectuer une compression lors de la réalisation récente d'un projet WCF.Je viens d'utiliser l'espace de noms System.IO.Compression et de créer 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;
    }
}

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

void ReceiveData(byte[] data);

Cela a bien fonctionné pour moi.

Il convient également de noter que vous devrez peut-être ajouter le type MIME à applicationHost.config sous <httpCompression><dynamicTypes> section 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.Le suivi des demandes ayant échoué peut être utile pour déterminer si IIS tente même de compresser la réponse.Si la compression est correctement configurée, vous verrez un NO_MATCHING_CONTENT_TYPE dans le trace complète section de la sortie de trace.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top