Как мы можем заставить MassTransit использовать HTTPS для подключения к Azure Service Bus, а не AMQP?
Наше приложение находится за брандмауэром предприятия. Нужно отправлять / получать сообщения от Azure Topi c. Мы бы предпочли использовать HTTPS, а не AMQP, чтобы это было проще для целей управления безопасностью.
Приложение имеет следующие настройки
- . NET Framework 4.6.2
- MassTransit. Azure .ServiceBus.Core 6..1.0
- Microsoft. Azure .ServiceBus 4.1.1
Из Azure документации по служебной шине мы должны быть в состоянии установить тип транспорта в AmqpWebSockets, который должен использовать HTTPS для связи. Строка подключения выглядит следующим образом:
Endpoint=sb://test.servicebus.windows.net/;SharedAccessKeyName=RootManageSharedAccessKey;SharedAccessKey=secret;TransportType=AmqpWebSockets
(ref: https://github.com/MicrosoftDocs/azure-docs/issues/14133)
Если мы используем TopicClient
из Microsoft.Azure.ServiceBus 4.1.1
, мы можем увидеть трафик c проходит через порт 443. Пример кода:
class Program
{
public static async Task Main(string[] args)
{
var serviceBus = new ServiceBus();
await serviceBus.SendMessageAsync();
Console.ReadKey();
}
}
public class ServiceBus
{
public async Task SendMessageAsync()
{
const int numberOfMessages = 10;
topicClient = new TopicClient(ServiceBusConnectionString, TopicName);
// Send messages.
await SendMessagesAsync(numberOfMessages);
Console.ReadKey();
await topicClient.CloseAsync();
}
public async Task SendMessagesAsync(int numberOfMessagesToSend)
{
try
{
for (var i = 0; i < numberOfMessagesToSend; i++)
{
// Create a new message to send to the topic.
string messageBody = $"Message {i}";
var message = new Message(Encoding.UTF8.GetBytes(messageBody));
// Write the body of the message to the console.
Console.WriteLine($"Sending message: {messageBody}");
// Send the message to the topic.
await topicClient.SendAsync(message);
}
}
catch (Exception exception)
{
Console.WriteLine($"{DateTime.Now} :: Exception: {exception.Message}");
}
}
}
Однако, когда мы используем ту же строку подключения, которая имеет TransportType=AmqpWebSockets
, MassTransit по-прежнему использует порт AMQP 5671
:
public class Order : IModel
{
public int Id { get; set; }
public double Amount { get; set; }
public string Description { get; set; }
}
public static async Task Main(string[] args)
{
var bus = Bus.Factory.CreateUsingAzureServiceBus(cfg =>
{
cfg.Host(ConnectionString);
});
await bus.StartAsync();
for (int i = 0; i < 100; i++)
{
var order = new Order() { Id = i, Amount = 20, Description = "Test order" };
await bus.Publish(order);
}
}
Вот трафик c, захваченный Wireshark:
Интересно, что он использует порт 443
для первых нескольких пакетов, а затем изменен на порт 5671