Сведения о вопросе

Htmlщик

16:22, 28th August, 2020

Теги

wcf   silverlight   compression   gzip    

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

Просмотров: 1251   Ответов: 4

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

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

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

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

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

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

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



  Сведения об ответе

COOL

23:34, 13th August, 2020

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

Смотрите WS-Compression for WCF by Pablo M. Cibraro

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


  Сведения об ответе

dump

16:17, 23rd August, 2020

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

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


  Сведения об ответе

SEEYOU

11:51, 11th August, 2020

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


  Сведения об ответе

ASSembler

08:23, 19th August, 2020

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

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться