You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker Compose中.NET主API调用次级API连接被拒问题

解决Docker Compose中.NET容器间API调用连接拒绝问题

问题分析

你遇到的核心矛盾是:代码指定调用http://mocktarjeta:80/api/Tarjeta,但异常显示尝试连接mocktarjeta:14332(宿主机映射端口)并被拒绝。这一般由以下几个原因导致:

  • mocktarjeta容器内部的.NET服务未正确监听80端口
  • 代码中的URL被配置文件/环境变量覆盖
  • 容器间网络或协议配置存在冲突

解决方案步骤

1. 验证mocktarjeta的内部端口监听配置

先确认mocktarjeta服务在容器内确实监听80端口:

  • 检查MockTarjeta/Dockerfile,确保包含EXPOSE 80 443指令,暴露内部端口
  • 查看Program.cs的启动配置,确保启用HTTP监听(.NET 6+默认已包含,但需确认未被修改):
    var builder = WebApplication.CreateBuilder(args);
    // 明确指定监听HTTP和HTTPS端口
    builder.WebHost.UseUrls("http://+:80", "https://+:443");
    
    var app = builder.Build();
    // ...其他中间件配置
    app.Run();
    
  • 检查appsettings.json,确保Urls配置未移除HTTP端口:
    {
      "Urls": "http://+:80;https://+:443",
      // ...其他配置项
    }
    

2. 排查代码中URL是否被覆盖

检查是否有配置文件或环境变量替换了硬编码的URL:

  • 搜索项目中是否存在类似MockTarjetaUrl的配置项,比如:
    {
      "MockTarjetaUrl": "http://localhost:14332/api/Tarjeta"
    }
    
  • 确认代码中确实使用了硬编码的容器内部地址,而非读取错误的配置:
    // 错误示例:读取了指向宿主机的配置
    // string apiUrl = Configuration["MockTarjetaUrl"];
    // 正确写法:
    string apiUrl = "http://mocktarjeta:80/api/Tarjeta";
    

3. 处理HTTPS证书问题(若改用443端口调用)

如果mocktarjeta仅启用HTTPS服务,容器间调用时需要处理自签名证书的信任问题:

  • 将调用地址改为https://mocktarjeta:443/api/Tarjeta
  • 在HttpClient中添加证书忽略逻辑(仅开发环境使用,生产环境需配置信任证书):
    using (HttpClient client = new HttpClient(new HttpClientHandler
    {
        ServerCertificateCustomValidationCallback = (sender, cert, chain, sslPolicyErrors) => true
    }))
    {
        // ...你的请求逻辑
    }
    

4. 确认Docker Compose网络配置

Docker Compose默认会为所有服务创建统一桥接网络,但如果手动配置了自定义网络,需确保所有服务都加入该网络:

version: '3.4'

networks:
  acme-network:
    driver: bridge

services:
  acmeapi:
    # ...原有配置
    networks:
      - acme-network
  mocktarjeta:
    # ...原有配置
    networks:
      - acme-network
  # 其他服务(sqlserver、mockfactura等)也需添加networks配置

5. 测试容器间连通性

进入acmeapi容器,用curl直接测试连接,定位问题节点:

# 进入acmeapi容器
docker exec -it acmeapi bash
# 测试HTTP连接
curl http://mocktarjeta:80/api/Tarjeta
# 测试HTTPS连接(忽略证书)
curl -k https://mocktarjeta:443/api/Tarjeta

如果curl请求失败,查看mocktarjeta的容器日志排查服务启动问题:

docker logs mocktarjeta

关键注意事项

  • 容器间通信只用内部端口:永远用容器内部的80/443端口,不要用宿主机映射的14332等端口,宿主机端口仅用于外部访问
  • 容器内不要用localhost:容器内的localhost指向自身,调用其他服务必须用服务名(如mocktarjeta)

内容的提问来源于stack exchange,提问作者Alexis252

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 14:22:03