MassTransit ACCESS_REFUSED при обмене не указан в коде - PullRequest
0 голосов
/ 09 апреля 2019

Я использую очень простой пример для тестирования моего соединения MassTransit с rabbitMq через C #. Всякий раз, когда я запускаю этот код для подключения к моей конечной точке rabbitMq, он прекрасно работает всякий раз, когда в качестве разрешения устанавливается подстановочный знак. Однако, когда я добавляю разрешения в администраторе rabbitMq, чтобы разрешить этому пользователю доступ только к событию test, этот код завершится ошибкой.

По какой-то причине он сначала попытается подключиться к обменному имени, которое, я полагаю, генерируется (MassTransit?):

RabbitMQ.Client.Exceptions.OperationInterruptedException: 'The AMQP operation was interrupted: AMQP close-reason, initiated by Peer, code=403, text="ACCESS_REFUSED - access to exchange '*ComputerName*_dotnet_bus_73451gfsgerqwrefxfddgf' in vhost '/' refused for user 'user'", classId=40, methodId=10, cause='

Итак, обмен *ComputerName*_dotnet_bus_73451gfsgerqwrefxfddgf, после этого он попытается подключиться к обмену test. Конечно, я могу добавить обмен ComputerName.... к разрешениям, но тогда это нужно будет сделать для каждого компьютера, пытающегося запустить этот код. Почему MassTransit пытается подключиться к этой бирже? Код неправильный или это просто как работает MassTransit?

Это код для тестового приложения (я немного изменил его, чтобы он мог работать не сразу, но в целом код работает нормально):

using System;
using MassTransit;

namespace Test
{
    public class Testing
    {
        public string Id { get; set; }
    }
}

namespace Consumer
{
    class Program
    {
        static void Main(string[] args)
        {
            var bus = Bus.Factory.CreateUsingRabbitMq(sbc =>
            {
                var host = sbc.Host(new Uri("rabbitmq://servername"), h =>
                {
                    h.Username("user");
                    h.Password("user");
                });

                sbc.ReceiveEndpoint(host, "test", ep =>
                {
                    ep.Handler<Testing>(context =>
                    {
                        return Console.Out.WriteLineAsync($"Received: {context.Message.Id}");
                    });
                });
            });

            bus.Start();

            // For testing purposes, we send a message ourselves.
            bus.Publish(new Testing { Id = "X" });

            Console.WriteLine("Waiting for messages. Press any key to exit");
            Console.ReadKey();

            bus.Stop();
        }
    }
}

Изображение разрешения пользователя rabbitMq admin:

Regex rabbitmqadmin permissions

1 Ответ

1 голос
/ 09 апреля 2019

Неправильный ли код или так работает MassTransit?

Скорее всего, именно так работает MassTransit. См. Этот другой вопрос: Запретить MassTransit создавать обмен RabbitMQ для хоста потребителя

Как ни странно, я не смог найти эту информацию нигде в документах MassTransit.

Вам необходимо предоставить разрешение configure для бирж, содержащих строку dotnet_bus. Скорее всего, потребуются другие разрешения, такие как read и write.


ПРИМЕЧАНИЕ: команда RabbitMQ контролирует список рассылки rabbitmq-users и только иногда отвечает на вопросы в StackOverflow.

...