public static Task ForwardCurrentMessageTo(IIncomingContext context, string destination)
        {
            var messageBeingProcessed = context.Extensions.Get <IncomingMessage>();
            var outgoingMessage       = new OutgoingMessage(
                messageBeingProcessed.MessageId,
                messageBeingProcessed.Headers,
                messageBeingProcessed.Body);

            var routingContext = new RoutingContext(outgoingMessage, new UnicastRoutingStrategy(destination), context);

            return(routingContext.InvokePipeline <IRoutingContext>());
        }
Beispiel #2
0
        void AssignResultIfPossible(IncomingMessage incomingMessage, IIncomingContext context)
        {
            if (!IsControlMessage(incomingMessage))
            {
                return;
            }

            var result = context.TryRemoveResponseStateBasedOnCorrelationId(incomingMessage, requestResponseStateLookup);

            if (!result.HasValue)
            {
                return;
            }

            var responseType = result.Value.TaskCompletionSource.ResponseType;
            var errorCode    = incomingMessage.Headers[Headers.ReturnMessageErrorCodeHeader];

            result.Value.TaskCompletionSource.TrySetResult(errorCode.ConvertFromReturnCode(responseType));
        }
Beispiel #3
0
        public static RequestResponseStateLookup.State?TryRemoveResponseStateBasedOnCorrelationId(this IIncomingContext context, IncomingMessage message, RequestResponseStateLookup lookup)
        {
            var correlationId = context.GetCorrelationId();

            if (correlationId == null)
            {
                return(null);
            }

            string version;
            var    checkMessageIntent = true;

            if (message.Headers.TryGetValue(Headers.NServiceBusVersion, out version))
            {
                Version parsedVersion;
                if (Version.TryParse(version, out parsedVersion))
                {
                    if (parsedVersion < minimumVersionThatSupportMessageIntent_Reply)
                    {
                        checkMessageIntent = false;
                    }
                }
            }

            var messageIntentEnum = message.GetMessageIntent();

            if (checkMessageIntent && messageIntentEnum != MessageIntentEnum.Reply)
            {
                return(null);
            }

            RequestResponseStateLookup.State state;
            return(lookup.TryRemove(correlationId, out state) ? (RequestResponseStateLookup.State?)state : null);
        }