未在代码中指定的交换上的MassTransit ACCESS_REFUSED
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了未在代码中指定的交换上的MassTransit ACCESS_REFUSED相关的知识,希望对你有一定的参考价值。
我正在使用一个非常基本的例子来测试我通过C#与RabbitMq的MassTransit连接。每当我运行此代码连接到我的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管理员用户权限的图片:
代码是不正确的还是这就是MassTransit的工作原理?
这很可能就是MassTransit的工作原理。看到另一个问题:Prevent MassTransit from creating a RabbitMQ exchange for a consumer host
奇怪的是,我无法在MassTransit文档中的任何位置找到此信息。
您必须为包含字符串configure
的交换授予dotnet_bus
权限。很可能需要其他权限,如read
和write
。
注意:RabbitMQ团队监控rabbitmq-users
mailing list,有时只回答StackOverflow上的问题。
以上是关于未在代码中指定的交换上的MassTransit ACCESS_REFUSED的主要内容,如果未能解决你的问题,请参考以下文章
第九十题(1.不开辟暂时空间交换 2.删除串中指定字符 3.推断链表中存在环)