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

StackOverflow https://stackoverflow.com/questions/10006

Вопрос

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

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

Я действительно нашел это Ссылка но это, конечно, кажется немного сложным для функциональности, которая должна обрабатываться "из коробки", ИМХО.

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

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

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

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

Это было полезно?

Решение

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

Другие советы

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

Видишь WS-Сжатие для WCF автор : Пабло М.Сибраро

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

Недавно я не видел встроенного способа для 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);

У меня все получилось хорошо.

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top