未在代码中指定的交易所进行MassTransit ACCESS_REFUSED

时间:2019-04-09 15:16:39

标签: c# rabbitmq access-denied masstransit

我正在使用一个非常基本的示例来测试我的MassTransit通过C#与RabbitMq的连接。每当我运行此代码以连接到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管理员用户权限的图像:

Regex rabbitmqadmin permissions

1 个答案:

答案 0 :(得分:1)

  

代码不正确吗?或者这就是MassTransit的工作原理吗?

这很可能就是MassTransit的工作方式。看到另一个问题:Prevent MassTransit from creating a RabbitMQ exchange for a consumer host

奇怪的是,我在MassTransit文档中的任何地方都找不到此信息。

您必须为包含字符串configure的交换授予dotnet_bus权限。很有可能需要其他权限,例如readwrite


注意: RabbitMQ团队监视rabbitmq-users mailing list,并且有时仅在StackOverflow上回答问题。