protected override async Task OnSetStateAsync(Stream sessionState)
        {
            try
            {
                if (sessionState != null && sessionState.CanSeek && sessionState.Position != 0)
                {
                    throw new InvalidOperationException("CannotSerializeSessionStateWithPartiallyConsumedStream");
                }

                AmqpRequestMessage amqpRequestMessage = AmqpRequestMessage.CreateRequest(ManagementConstants.Operations.SetSessionStateOperation, this.OperationTimeout, null);
                amqpRequestMessage.Map[ManagementConstants.Properties.SessionId] = this.SessionId;

                if (sessionState != null)
                {
                    BufferListStream    buffer = BufferListStream.Create(sessionState, AmqpConstants.SegmentSize);
                    ArraySegment <byte> value  = buffer.ReadBytes((int)buffer.Length);
                    amqpRequestMessage.Map[ManagementConstants.Properties.SessionState] = value;
                }
                else
                {
                    amqpRequestMessage.Map[ManagementConstants.Properties.SessionState] = null;
                }

                await this.InnerMessageReceiver.ExecuteRequestResponseAsync(amqpRequestMessage).ConfigureAwait(false);
            }
            catch (AmqpException amqpException)
            {
                throw AmqpExceptionHelper.ToMessagingContract(amqpException.Error);
            }
        }
Exemplo n.º 2
0
        public void AmqpMessageReceiveResendTest()
        {
            var message = AmqpMessage.Create(new AmqpValue {
                Value = "Hello, AMQP!"
            });

            message.MessageAnnotations.Map["key"] = "old";

            // send the message and receive it on remote side
            var payload       = message.GetPayload();
            var streamMessage = AmqpMessage.CreateAmqpStreamMessage(new BufferListStream(payload));

            //new OutputMessage for resending with modified sections
            var stream = BufferListStream.Create(streamMessage.ToStream(), AmqpConstants.SegmentSize, streamMessage.Settled);

            stream.Seek(0, System.IO.SeekOrigin.Begin);
            var outMessage = AmqpMessage.CreateOutputMessage(stream, false);

            outMessage.Settled = streamMessage.Settled;
            //explicitly assign
            outMessage.Header.Priority = 99;
            outMessage.DeliveryAnnotations.Map["key"] = "da-update";
            outMessage.MessageAnnotations.Map["key"]  = "update";

            // send
            var payload2 = outMessage.GetPayload();
            var value    = (string)outMessage.MessageAnnotations.Map["key"];

            Assert.Equal("update", value);

            // receive
            var streamMessage2 = AmqpMessage.CreateAmqpStreamMessage(new BufferListStream(payload2));

            Assert.Equal(99, streamMessage2.Header.Priority.Value);
            value = (string)outMessage.DeliveryAnnotations.Map["key"];
            Assert.Equal("da-update", value);
            value = (string)outMessage.MessageAnnotations.Map["key"];
            Assert.Equal("update", value);
        }