c# - 无法通过 masstransit Broker 发送消息无法访问:guest@localhost:5672/
问题描述
我是码头工人的新手。我创建了一个 .net core 5.0 web api 项目。
更新 最初,我在启动时收到以下错误。我目前在尝试发送消息时收到错误消息。
目标:通过公共交通发送消息
错误: 警告:MassTransit[0] 重试 00:00:08.1220000:代理无法访问:guest@localhost:5672/MassTransit.RabbitMqTransport.RabbitMqConnectionException:代理无法访问:guest@localhost:5672/ ---> RabbitMQ.Client.Exceptions.BrokerUnreachableException :指定的端点均不可访问---> System.AggregateException:发生一个或多个错误。(连接失败)---> RabbitMQ.Client.Exceptions.ConnectFailureException:连接失败---> System.Net.Sockets.SocketException(111):连接被拒绝
我创建了一个docker-compose文件
version: '3.4'
networks:
poc:
services:
rabbitmq:
image: masstransit/rabbitmq:latest
networks:
- poc
container_name: rabbitmq
environment:
RABBITMQ_ERLANG_COOKIE: ${RABBITMQ_ERLANG_COOKIE}
RABBITMQ_DEFAULT_USER: ${RABBITMQ_DEFAULT_USER}
RABBITMQ_DEFAULT_PASS: ${RABBITMQ_DEFAULT_PASS}
ports:
- 5672:5672
- 15672:15672
webapi:
image: ${DOCKER_REGISTRY-}webapi
build:
context: .
dockerfile: WebApi/Dockerfile
ports:
- 5100:80
test:
image: ${DOCKER_REGISTRY-}test
build:
context: .
dockerfile: Test/Dockerfile
ports:
- 5101:80
在我在WebApi端的startup.cs中......
services.AddMassTransit(mt =>
{
mt.UsingRabbitMq((context, cfg) =>
{
cfg.AutoStart = true;
cfg.Host("rabbitmq");
cfg.UseRabbitMqMessageScheduler();
cfg.ConfigureEndpoints(context);
});
});
我的控制器
public class OrderController : Controller
{
private readonly IBusControl _bus;
public OrderController(IBusControl bus)
{
_bus = bus;
}
[HttpPost("api/order")]
public async Task<IActionResult> Index([FromBody] Order order)
{
try
{
Uri uri = new Uri("queue:order-queue");
var endpoint = await _bus.GetSendEndpoint(uri);
await endpoint.Send(order);
return Ok("Success");
}
catch (Exception exception)
{
return StatusCode(500, exception);
}
}
}
解决方案
当我在Docker中运行服务时,我发现这localhost
不起作用。因此,我使用检查来查看我是否在容器中并使用rabbitmq
主机名(或 RabbitMQ 容器的主机名在docker-compose.yml
.
static bool? _isRunningInContainer;
static bool IsRunningInContainer =>
_isRunningInContainer ??= bool.TryParse(Environment.GetEnvironmentVariable("DOTNET_RUNNING_IN_CONTAINER"), out var inContainer) && inContainer;
然后,在UsingRabbitMq
:
if (IsRunningInContainer)
cfg.Host("rabbitmq");
如果您需要查看它是如何连接的,这是一个工作示例。
推荐阅读
- css - 无法右对齐 a 内的项目
- . 项目和边框之间的奇怪空间
- lua - string.find 的检查表
- python - 搜索大型文本或日志文件 (10GB+)
- imagemagick - Elixir Imagemagick 重力偏移
- python - 如何使用 re 模块替换父文本中重复片段中的文本?
- azure-sql-database - Azure SQL 将“时区显示名称”转换为“时区 ID”
- django - Django中的可选用户列表?
- arduino - Arduino Pro Micro 未上传任何代码(avrdude:ser_open():无法打开设备“/dev/ttyACM0”:权限被拒绝)
- sql - 具有 6 个字符和通配符条件的 SQL 查询
- makefile - GNU 直接跳过链接