MassTransit Azure ServiceBus заставляет соединение использовать HTTPS вместо AMQP - PullRequest
2 голосов
/ 21 февраля 2020

Как мы можем заставить 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: enter image description here

Интересно, что он использует порт 443 для первых нескольких пакетов, а затем изменен на порт 5671

1 Ответ

2 голосов
/ 21 февраля 2020

Найдя решение, вы можете установить тип транспорта при настройке шины:

var bus = Bus.Factory.CreateUsingAzureServiceBus(cfg =>
{
    cfg.Host(ConnectionString, hc => hc.TransportType = TransportType.AmqpWebSockets);
    cfg.PrefetchCount = 1;
    AddSubscriptionEndpoints(context, cfg);
});

Корзина go, теперь она использует порт 443 enter image description here

...