public override void WriteMessage(Message message, Stream stream) { CompressionContext context = OperationContext.Current.Extensions.Find <CompressionContext>(); if (context != null) { Stream outerStream = context.Type == CompressionType.GZip ? (Stream) new GZipStream(stream, CompressionMode.Compress, true) : context.Type == CompressionType.Deflate ? (Stream) new DeflateStream(stream, CompressionMode.Compress, true) : null; if (outerStream != null) { innerEncoder.WriteMessage(message, outerStream); outerStream.Dispose(); } // innerEncoder.WriteMessage(message, gzStream) depends on that it can flush data by flushing // the stream passed in, but the implementation of the compression stream's Flush will not // flush underlying stream, so we need to flush here. stream.Flush(); } else { innerEncoder.WriteMessage(message, stream); } }
//One of the two main entry points into the encoder. Called by WCF to encode a Message into a buffered byte array. public override ArraySegment <byte> WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset) { CompressionContext context = OperationContext.Current.Extensions.Find <CompressionContext>(); if (context != null) { //Use the inner encoder to encode a Message into a buffered byte array ArraySegment <byte> buffer = innerEncoder.WriteMessage(message, maxMessageSize, bufferManager, messageOffset); //Compress the resulting byte array ArraySegment <byte> compressedBuffer = CompressBuffer(buffer, bufferManager, messageOffset, context.Type); Log.Trace("CompressionMessageEncoder::WriteMessage {0} compressed {1} bytes to {2}", context.Type, buffer.Array.Length, compressedBuffer.Array.Length); return(compressedBuffer); } else { return(innerEncoder.WriteMessage(message, maxMessageSize, bufferManager, messageOffset)); } }