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

Недавно я подключил пользовательский кодировщик (использует двоичный кодировщик для фактического кодирования и 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 ответа

Если вы используете 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 = несжатый, 1 = сжатый Gzip, 2 - 255 = будущие алгоритмы сжатия?

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

Другие вопросы по тегам