Example #1
0
            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);
                }
            }
Example #2
0
            //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));
                }
            }