wcf условное сжатие - PullRequest
       18

wcf условное сжатие

2 голосов
/ 08 января 2011

Я недавно подключил пользовательский кодер (использует двоичный кодер для фактического кодирования и Gzip-компрессор для сжатия массива байтов).Работает нормально.Теперь проблема в том, что при небольшом размере сообщения он надувает байтовый массив.Я хотел бы знать, есть ли способ избежать этого.В частности, если есть способ, которым я могу применить сжатие и декомпрессию условий.

Я пытался сделать что-то вроде - поместите условие

if(buffer.Count <= 5000)
 skip compression

Но проблема в том, что декомпрессия на другом конце будетпроизойдет, даже если байты не сжаты.Я надеюсь, что это имеет смысл.

Ниже приведены функции, в которых происходит сжатие и распаковка (фрагмент кода из CompactMessageEncoder)

public override Message ReadMessage(ArraySegment<byte> buffer, BufferManager bufferManager, string contentType)
        {

            ArraySegment<byte> decompressedBuffer = DecompressBuffer(buffer, bufferManager);
            LogWrite("Decompressed from {0} bytes to {1} bytes", buffer.Count, decompressedBuffer.Count);

            Message returnMessage = _innerEncoder.ReadMessage(decompressedBuffer, bufferManager);

            returnMessage.Properties.Encoder = this;
            return returnMessage;
        }



public override ArraySegment<byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset)
        {
            var buffer = _innerEncoder.WriteMessage(message, maxMessageSize, bufferManager, messageOffset);

            var compressedBuffer = CompressBuffer(buffer, bufferManager, messageOffset);
            LogWrite("Compressed from {0} bytes to {1} bytes", buffer.Count, compressedBuffer.Count);

            return compressedBuffer;
        }

Ответы [ 2 ]

2 голосов
/ 02 сентября 2011

Если вы используете http и если вы используете IIS 7 или выше (это также возможно с 6, но конфигурация сложнее, очевидно), вы можете использовать встроенное сжатие gzip / deflate.

См. http://www.iis.net/ConfigReference/system.webServer/httpCompression

Эта ссылка также объясняет такие параметры, как minFileSizeForComp, которая точно решает вашу проблему.У него также есть много других приятных параметров, таких как «dynamicCompressionDisableCpuUsage», которые отключают сжатие при превышении определенной загрузки ЦП.

Хорошая особенность http-сжатия заключается в том, что она является стандартной, и клиент и сервер могут определитьза запрос, могут ли они или хотят сжать, используя стандартные HTTP-заголовки запроса и ответа.Кроме того, формат сжатия может быть изменен с gzip на deflate, последнее имеет несколько преимуществ, хотя и не используется так часто.См. http://madskristensen.net/post/Compression-and-performance-GZip-vs-Deflate.aspx и http://www.vervestudios.co/projects/compression-tests/

Один потенциальный недостаток - в зависимости от вашего приложения, заключается в том, что сжатие http выполняется только с сервера -> клиента, поэтому, если ваши запросы огромны, это может статьпроблема, но в большинстве случаев ответы сервера будут намного больше, чем запросы клиентов. Редактировать: если вы хотите добавить пользовательский IHttpModule, вы даже можете получить сжатие запроса.

Я только что успешно перенес ферму с интенсивным использованием из 20серверы от GZIPMessageEncoder до http-сжатия IIS 7.5.

Кстати, не используйте пример MS GzipMessageEncoder в буферизованном режиме передачи, который используется по умолчанию.GzipMessageEncoder просто тратит впустую тонны памяти - сотни мегабайт в моем конкретном случае, смотрите мой ответ здесь: WCF HttpTransport: потоковый и буферизованный TransferMode

0 голосов
/ 08 января 2011

Не могли бы вы написать байт, который бы указывал, были ли данные сжаты или нет?0 = несжатый, 1 = сжатый Gzip, 2 - 255 = будущие алгоритмы сжатия?

Вы можете написать несжатую длину, но это будет зависеть от сервера и клиента, использующих одинаковую длину отсечения для не сжатияВы можете написать логическое значение, указывающее, является ли он сжатым, но это все равно займет целый байт, и вы можете оставить себя открытым для будущего расширения, написав значение 0-255.(Возможно, вы обнаружите, что с вашими данными другой алгоритм сжатия может дать еще лучшее сжатие.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...