MessageWrapper BuildMessageWrapper(IOutgoingTransportOperation operation, QueueAddress destinationQueue) { var msg = operation.Message; var headers = new Dictionary<string, string>(msg.Headers); addressing.ApplyMappingOnOutgoingHeaders(headers, destinationQueue); return new MessageWrapper { Id = msg.MessageId, Body = msg.Body, CorrelationId = headers.GetValueOrDefault(Headers.CorrelationId), // TODO: Will be addresses in another PR // Recoverable = operation.GetDeliveryConstraint<NonDurableDelivery>() == null, ReplyToAddress = headers.GetValueOrDefault(Headers.ReplyToAddress), Headers = headers, MessageIntent = operation.GetMessageIntent() }; }
/// <summary> /// Maps the account name to a connection string, throwing when no mapping found. /// </summary> internal ConnectionString Map(QueueAddress address) { if (registeredEndpoints.TryGetValue(address.QueueName, out var accountInfo)) { return(accountInfo.Connection); } var account = address.StorageAccount; if (aliasToAccountInfoMap.TryGetValue(account, out accountInfo) == false) { if (useLogicalQueueAddresses == false) { return(new ConnectionString(account)); } throw new Exception($"No account was mapped under following name '{address.StorageAccount}'. Please map it using .AccountRouting().AddAccount() method."); } return(accountInfo.Connection); }
/// <summary> /// Maps the account name to a QueueServiceClient, throwing when no mapping found. /// </summary> internal QueueServiceClient Map(QueueAddress address, MessageIntentEnum messageIntent) { if (registeredEndpoints.TryGetValue(address, out var accountInfo)) { return(accountInfo.QueueServiceClient); } var storageAccountAlias = address.Alias; if (aliasToAccountInfoMap.TryGetValue(storageAccountAlias, out accountInfo) == false) { // If this is a reply message with a connection string use the connection string to construct a queue service client. // This was a reply message coming from an older endpoint w/o aliases. if (messageIntent == MessageIntentEnum.Reply && CloudStorageAccount.TryParse(address.Alias, out _)) { return(new QueueServiceClient(address.Alias)); } throw new Exception($"No account was mapped under following name '{address.Alias}'. Please map it using .AccountRouting().AddAccount() method."); } return(accountInfo.QueueServiceClient); }
/// <summary> /// Transforms reply-to header to connection string values to maintain backward compatibility. /// </summary> internal void ApplyMappingOnOutgoingHeaders(Dictionary <string, string> headers, QueueAddress destinationQueue) { if (headers.TryGetValue(Headers.ReplyToAddress, out var headerValue)) { var address = QueueAddress.Parse(headerValue); if (address.HasNoAlias == false) { return; } var destinationHasAlias = destinationQueue.HasNoAlias == false; if (destinationHasAlias && address.HasNoAlias) { headers[Headers.ReplyToAddress] = new QueueAddress(address.QueueName, defaultConnectionStringAlias).ToString(); } } }
/// <summary> /// Transforms all the <see cref="QueueAddress" /> in <see cref="headersToApplyNameMapping" /> to connection string /// values to maintain backward compatibility. /// </summary> internal void ApplyMappingOnOutgoingHeaders(Dictionary <string, string> headers, QueueAddress destinationQueue) { foreach (var header in headersToApplyNameMapping) { if (headers.TryGetValue(header, out var headerValue)) { var address = QueueAddress.Parse(headerValue); var isFullyQualifiedAddress = address.IsAccountDefault == false; if (isFullyQualifiedAddress) { continue; } if (useLogicalQueueAddresses) { var sendingToAnotherAccount = destinationQueue.IsAccountDefault == false; if (sendingToAnotherAccount && address.IsAccountDefault) { headers[header] = new QueueAddress(address.QueueName, defaultConnectionStringAlias).ToString(); } } else { var connectionString = Map(address); headers[header] = new QueueAddress(address.QueueName, connectionString.Value).ToString(); } } } }