【问题标题】:MassTransit ACCESS_REFUSED on exchange not specified in the code代码中未指定交易所的 MassTransit ACCESS_REFUSED
【发布时间】:2019-04-10 04:08:29
【问题描述】:

我正在使用一个非常基本的示例来测试我的 MassTransit 通过 C# 与 rabbitMq 的连接。每当我运行此代码以连接到我的 rabbitMq 端点时,只要我将通配符设置为权限,它就可以正常工作。但是,当我在 rabbitMq admin 中添加权限以仅允许此用户访问 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 用户权限的图片:

【问题讨论】:

    标签: c# rabbitmq access-denied masstransit


    【解决方案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 上的问题。

    【讨论】:

    • 还有其他的交换和/或队列可能会被创建为错误,这样会出现在正在运行的生产系统中。如果 MT 无法创建错误队列等,尝试锁定 MassTransit 可能会导致无法从故障中恢复。当坏事发生时,也可能会创建故障交换和其他事情。如果不能创建,MT会卡住无法继续。
    • 奇怪的是,我只是想连接到“测试”交易所,为什么masstransit 会创建两个交易所?一个用于测试,一个用 dotnet_bus 生成?
    • MassTransit “为您”做了很多事情,无论好坏。这一定是其中之一。我建议询问特定于该库的支持论坛。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多