无法通过大众运输代理发送消息无法访问:guest@localhost:5672/

问题描述

我是 docker 新手。我创建了一个 .net core 5.0 web api 项目。

更新 最初,我在启动时收到以下错误。我目前在尝试发送消息时收到错误消息。

目标:通过大众运输发送消息

错误 警告:大众运输[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

在我的 startup.cs 中的 WebApi 端...

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 中运行服务时,我发现 iplist= list(ipaddress.ip_network(network).hosts()) notepad1 = open('oddnetworks.txt','w') for i in range(10,len(iplist),2): print(iplist[I]) notepad1.write(iplist) # Don't forget to close! notepad1.close() 不起作用。因此,我使用检查来查看我是否在容器中并使用 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

working example,如果您需要了解它是如何连接的。