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); } }
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); }