首页 > 解决方案 > 无法通过 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);
            }
        }
    }

标签: c#docker.net-corerabbitmqmasstransit

解决方案


当我在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");

如果您需要查看它是如何连接的,这是一个工作示例。


推荐阅读