Jaki jest najprostszy sposób na dodanie kompresji do WCF w Silverlight?

Mam aplikację silverlight 2 beta 2, która ma dostęp do serwisu WWW WCF. Z tego powodu obecnie może używać tylko wiązania basicHttp. Webservice zwróci dość duże ilości danych XML. Wydaje się to dość marnotrawne z punktu widzenia wykorzystania przepustowości, ponieważ odpowiedź, jeśli jest spakowana, byłaby mniejsza o współczynnik 5 (w rzeczywistości wkleiłem odpowiedź do pliku txt i spakowałem ją.).

Żądanie ma "Accept-Encoding: gzip, deflate" - czy jest jakiś sposób aby WCF service gzip (lub inaczej kompresować) odpowiedź?

Znalazłem ten link ale na pewno wydaje się to trochę skomplikowane dla funkcjonalności, które powinny być obsługiwane out-of-the-box IMHO.

OK-na początku zaznaczyłem rozwiązanie za pomocą System.IO.Compression jako odpowiedź, ponieważ nigdy nie mogłem "wydawać się", aby kompresja dynamiczna IIS7 działała. Jak się okazuje:

  1. Dynamiczna kompresja na IIS7 była Działa al. Po prostu Nikhil ' s Web Wtyczka pomocnicza programisty dla IE nie pokazała, że działa. Domyślam się, że skoro SL przekazuje usługę sieciową do przeglądarki, to przeglądarka obsługuje ją "pod przykrywką", a narzędzie Nikhila nigdy nie widzi skompresowanej odpowiedzi. Udało mi się to potwierdzić za pomocą programu Fiddler, który monitoruje ruch na zewnątrz przeglądarki. W fiddler odpowiedź była, w rzeczywistości, GZIP skompresowany!!

  2. Innym problemem z rozwiązaniem kompresji System. IO jest to, że System.IO. Compression nie istnieje w Silverlight CLR.

Więc z mojego punktu widzenia najprostszym sposobem na włączenie kompresji WCF w Silverlight jest włączenie dynamicznej kompresji w IIS7 i napisanie żadnego kodu.

Author: Drew Noakes, 2008-08-13

4 answers

Jeśli używasz IIS7, spójrz na moduł kompresji . Pozwala to skonfigurować kompresję żądań HTTP do serwera.

 10
Author: Lance Fisher,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-13 18:22:03

WS-Compression for WCF pozwala skonfigurować kompresję na wiązaniu.

Zobacz WS-kompresja dla WCF By Pablo M. Cibraro

Alternatywnie wypróbuj próbkę kodera Microsofts gzip Encoder Sample , który "tworzy kanał kodera, który używa klasy System.IO.Compression.GZipStream do kompresji wychodzących wiadomości WCF"

 12
Author: Daniel Ballinger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-30 15:43:37

Nie widziałem natywnego sposobu na kompresję WCF podczas wykonywania projektu WCF. Po prostu użyłem przestrzeni nazw System.IO.Compression i zrobiłem szybki kompresor. Oto kod, którego użyłem

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

Wtedy moje usługi pobierały tablicę bajtów jako dane wejściowe, takie jak

void ReceiveData(byte[] data);
Dobrze mi poszło.
 11
Author: Darren Kopp,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-13 16:28:06

Należy również zauważyć, że może być konieczne dodanie typu mime do applicationHost.config w sekcji <httpCompression><dynamicTypes> oprócz włączenia kompresji dla strony:

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

Jeśli niektóre dynamiczne odpowiedzi nie są kompresowane (a niektóre są), może to być problem typu mime. Użyj Fiddler, aby uzyskać szczegóły związane z żądaniem. Nieudane śledzenie żądań może być przydatne do określenia, czy usługa IIS próbuje nawet skompresować odpowiedź. Jeśli kompresja jest poprawnie skonfigurowana, będziesz Zobacz NO_MATCHING_CONTENT_TYPEw sekcji complete trace wyjścia śledzenia.

 3
Author: Mike H.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-28 13:55:16