Какой самый простой способ добавить сжатие к WCF в Silverlight?

У меня есть приложение silverlight 2 beta 2, которое обращается к веб-сервису WCF. Из-за этого в настоящее время он может использовать только привязку basicHttp. Веб-сервис вернет довольно большие объемы данных XML. Это кажется довольно расточительным с точки зрения использования полосы пропускания, так как ответ, если он сжат, будет меньше в 5 раз (я фактически вставил ответ в текстовый файл и сжал его.).

Запрос имеет «Accept-Encoding: gzip, deflate» - есть ли у службы WCF gzip (или иным образом сжатый) ответ?

Я нашел эту ссылку, но она кажется немного сложной для функциональности, которая должна быть обработана из коробки IMHO.

Хорошо - сначала я отметил решение, используя System.IO.Compression в качестве ответа, поскольку я никогда не мог «заставить» работать динамическое сжатие IIS7. Ну как получается

  1. Динамическое сжатие на IIS7 была работать аль вместе. Просто плагин Nikhil Web Developer Helper для IE не показал, что он работает. Я предполагаю, что, поскольку SL передает вызов веб-службы браузеру, браузер обрабатывает его «под прикрытием», и инструмент Никхила никогда не видит сжатый ответ. Я смог подтвердить это с помощью Fiddler, который отслеживает трафик, внешний по отношению к приложению браузера. В Fiddler ответ был сжат GZIP!

  2. Другая проблема с решением System.IO.Compression заключается в том, что System.IO.Compression не существует в CLR Silverlight.

Поэтому, с моей точки зрения, самый простой способ включить сжатие WCF в Silverlight - это включить динамическое сжатие в IIS7 и вообще не писать код.

13.08.2008 16:08:43
Динамическое сжатие работает только для некоторых запросов (то есть тех, которые IIS считает часто вызываемыми). так что это хорошая функция, но вы не можете ее контролировать. У меня действительно большой звонок, когда пользователь входит в систему, но это происходит раз в день. и это не сжато.
Boppity Bop 16.04.2013 14:45:51
4 ОТВЕТА
РЕШЕНИЕ

Если вы используете IIS7, взгляните на модуль сжатия . Это позволяет вам настроить сжатие для HTTP-запросов к вашему серверу.

10
13.08.2008 18:22:03
Некоторые оговорки здесь: мой рабочий прокси удаляет заголовок accept gzip (wtf, верно?). И вы только сжимаете данные, идущие к клиенту.
russau 17.09.2009 05:38:56

Я недавно не видел собственного способа сделать сжатие в WCF при выполнении проекта WCF. Я просто использовал пространство имен System.IO.Compression и сделал быстрый компрессор. Вот код, который я использовал

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

тогда я просто сделал, чтобы мои сервисы принимали байтовый массив в качестве входа, например

void ReceiveData(byte[] data);

Сработало хорошо для меня.

11
13.08.2008 16:28:06
Обратите внимание, что GZipStream недоступен в Silverlight 2 CLR. У DimeBrain есть и реализация SharpZipLib здесь: dimebrain.com/2008/06/compression-i-1.html
russau 17.09.2009 07:26:32

WS-Compression для WCF позволяет настроить сжатие для привязки.

См. WS-Compression для WCF Пабло М. Сибраро

В качестве альтернативы, попробуйте Microsofts GZip Encoder Sample, который «создает канал кодера, который использует класс System.IO.Compression.GZipStream для сжатия исходящих сообщений WCF»

12
30.01.2015 15:43:37
Единственное предостережение в том, что silverlight 2 вообще не поддерживает WS-привязки, а только базовые Http-привязки.
caryden 23.01.2009 15:28:55

Следует также отметить, что вам может понадобиться добавить тип mime в раздел applicationHost.configunder <httpCompression><dynamicTypes>в дополнение к включению сжатия для сайта:

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

Если некоторые динамические ответы не сжимаются (а некоторые есть), это может быть проблемой типа MIME. Используйте Fiddler, чтобы получить подробности, связанные с запросом. Трассировка сбойного запроса может быть полезна при определении того, пытается ли IIS даже сжать ответ. Если сжатие настроено правильно, вы увидите его NO_MATCHING_CONTENT_TYPEв разделе полной трассировки вывода трассировки.

3
28.04.2017 13:55:16
Это сделало это для меня. Однако следует отметить, что вы должны установить этот параметр в файле C: \ Windows \ System32 \ inetsrv \ config \ applicationHost.config, поскольку параметр web.config игнорируется. Работал сразу, как только я это изменил.
R4cOOn 30.07.2010 14:01:34