Domanda

Ho un silverlight 2 beta 2 applicazione che accede a un WCF web service.A causa di questo, è attualmente possibile utilizzare solo basicHttp associazione.Il webservice tornerà abbastanza grandi quantità di dati XML.Questo sembra abbastanza dispendioso da un punto di vista dell'utilizzo della larghezza di banda, come la risposta, se compresso, sarebbe più piccolo di un fattore 5 (in realtà ho incollato la risposta in un file txt e zip, it.).

La richiesta non hanno "Accept-Encoding:gzip, deflate" - c'È un modo per avere il servizio WCF gzip (o comunque comprimere) la risposta?

Ho trovato questo link ma di sicuro sembra un po ' complesso per le funzionalità che devono essere gestite out-of-the-box, IMHO.

OK, prima ho segnato la soluzione che utilizza il Sistema.IO.Compressione come la risposta, come ho potuto non "sembra" per ottenere il IIS7 compressione dinamica per lavoro.Beh, a quanto pare:

  1. La Compressione dinamica su IIS7 era di lavoro al lungo.È solo che Nikhil Web Developer Helper plugin per IE non mostrare di lavoro.La mia ipotesi è che, poiché SL mani la chiamata al servizio web di sconto per il browser, il browser gestisce "sotto le coperte" e Nikhil strumento non vede mai la risposta compressa.Sono stato in grado di confermare questo utilizzando il Violinista che monitora il traffico esterno per l'applicazione del browser.In fiddler, la risposta è stata, infatti, compresso gzip!!

  2. L'altro problema con il Sistema.IO.Soluzione di compressione del Sistema.IO.La compressione non esiste in Silverlight CLR.

Quindi, dal mio punto di vista, il modo più SEMPLICE per attivare WCF compressione in Silverlight è quello di abilitare la Compressione Dinamica in IIS7 e scrivere alcun codice.

È stato utile?

Soluzione

Se si utilizza IIS7, date un'occhiata al Compressione Modulo.Questo consente di configurare la compressione per le richieste HTTP al server.

Altri suggerimenti

WS-Compressione per WCF consente di configurare la compressione dell'associazione.

Vedere WS-Compressione per WCF Pablo M.Cibraro

In alternativa, provare L' GZip Encoder Campione che "crea un encoder canale che utilizza il Sistema.IO.La compressione.Classe GZipStream per comprimere in uscita dei messaggi WCF"

Non ho visto un modo nativo per WCF per fare la compressione quando si fa un progetto WCF di recente.Ho appena usato il Sistema.IO.La compressione dello spazio dei nomi e ha fatto un rapido compressore.Ecco il codice che ho usato

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

poi ho avuto i miei servizi in una matrice di byte in input, come ad

void ReceiveData(byte[] data);

Ha funzionato bene per me.

Si deve anche notare che potrebbe essere necessario aggiungere il tipo mime per applicationHost.config sotto <httpCompression><dynamicTypes> la sezione, oltre a consentire la compressione per il sito:

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

Se alcune delle risposte dinamiche non vengono compressi (e alcuni lo sono) potrebbe essere un tipo mime problema.Usare Fiddler per ottenere le specifiche associato alla richiesta.Richiesta non riuscita traccia può essere utile nel determinare se o non IIS è anche il tentativo di compressione la risposta.Se la compressione è stato configurato correttamente, verrà visualizzato un NO_MATCHING_CONTENT_TYPE nel completo di traccia la sezione di output della traccia.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top