Подтвердить что ты не робот

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

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

В запросе есть "Accept-Encoding: gzip, deflate". Есть ли способ, чтобы служба gmail (или иным образом сжимала) WCF ответ?

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

ОК - сначала я пометил решение, используя System.IO.Compression, в качестве ответа, поскольку я никогда не мог "показаться", чтобы заставить динамическое сжатие IIS7 работать. Ну, как выясняется:

  • Динамическое сжатие на IIS7 было, работающее вместе. Это просто, что модуль Nikhil Web Developer Helper для IE не показал его работоспособности. Я предполагаю, что поскольку SL передает вызов веб-службы в браузер, браузер обращается к нему "под обложками", а инструмент Nikhil никогда не видит сжатого ответа. Я смог подтвердить это, используя Fiddler, который отслеживает трафик, внешний для приложения браузера. В fiddler ответ был, по сути, сжат gzip!!

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

См. WS-Compression для WCF от Pablo M. Cibraro

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

Ответ 3

Я не видел родной путь для 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);

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

Ответ 4

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

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

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