예제 #1
0
        /// <summary>
        /// Constructs a InboundBaseStreamWireMessage from the Wire message (Byte segments)
        /// </summary>
        /// <param name="wireMessage">Wire Message</param>
        internal InboundBaseStreamWireMessage(IOperationData wireMessage)
        {
            // Retreive message header
            var wireMessageSegmentEnumerator = wireMessage.GetEnumerator();
            var headerExists = wireMessageSegmentEnumerator.MoveNext();

            Diagnostics.Assert(headerExists, "InboundStableParameters wire message missing header segment");
            this.headerSegment = wireMessageSegmentEnumerator.Current;

            // is this the right check regardless of version?
            Diagnostics.Assert(this.headerSegment.Count == EncodedByteLength, "Header segment in stream wire message incorrect length");
            // Decode Header
            this.DecodeHeaderSegment();

            // Retreive message payload
            var segmentExists = wireMessageSegmentEnumerator.MoveNext();

            if (segmentExists)
            {
                var payloadSegment = wireMessageSegmentEnumerator.Current;

                // We rely on the fact that the managed session layer will return a whole byte array not a segment
                // The asserts verify that assumption
                this.Payload = payloadSegment.Array;
                Diagnostics.Assert(payloadSegment.Offset == 0, "Payload segment in inbound session message not whole array");
                Diagnostics.Assert(payloadSegment.Count == this.Payload.Length, "Payload segment in inbound session message not whole array");
            }
            else
            {
                this.Payload = null;
            }
        }