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

Docker容器内.NET 8应用调用WebAPI遇连接拒绝与SSL问题求助

解决方案:Docker容器间.NET应用调用问题

一、HTTP请求连接拒绝的解决

容器内的Web应用调用同Compose环境下的WebAPI,不要使用主机IP、localhost或host.docker.internal,应该直接用Docker Compose定义的服务名作为主机地址,搭配容器内部的端口:

  • 正确的API地址应为:http://demo-catalogue-api:8080
    • demo-catalogue-api是你在docker-compose配置中定义的服务名,Docker Compose会自动在内部网络中解析这个名称到对应容器的IP
    • 8080是容器内部的HTTP端口(对应你配置的ASPNETCORE_HTTP_PORTS=8080),而非主机映射的5001端口

这样调用就能绕过主机端口映射,直接在Docker内部网络通信,不会出现连接拒绝的问题。

二、HTTPS连接无法建立的解决

HTTPS的问题核心是证书信任不匹配:你的API容器使用的是主机生成的HTTPS证书,证书的主题名称(CN)通常是localhost或主机名,但WebApp容器调用时用的是服务名demo-catalogue-api,证书验证会失败。以下是两种可行方案:

方案1:开发环境临时禁用证书验证(仅用于调试)

在RestSharp客户端配置中添加证书验证回调,忽略错误:

var client = new RestClient("https://demo-catalogue-api:8081");
// 仅开发环境使用,生产环境绝对不能这么做
client.RemoteCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true;
var request = new RestRequest("/your-api-endpoint");
var response = await client.GetAsync(request);

方案2:配置可信证书(推荐,更接近生产环境)

  1. 生成针对服务名的证书:
    使用.NET CLI生成包含服务名demo-catalogue-api的证书:
    dotnet dev-certs https -ep ${APPDATA}/ASP.NET/Https/demo-catalogue-api.pfx -p 你的证书密码
    dotnet dev-certs https --trust
    
  2. 修改docker-compose.override.yml配置:
    为API服务指定证书文件,同时让WebApp容器信任该证书:
    version: '3.4'
    
    services:
      demo-catalogue-api:
        environment:
          - ASPNETCORE_ENVIRONMENT=Development
          - ASPNETCORE_HTTP_PORTS=8080
          - ASPNETCORE_HTTPS_PORTS=8081
          - ASPNETCORE_Kestrel__Certificates__Default__Path=/home/app/.aspnet/https/demo-catalogue-api.pfx
          - ASPNETCORE_Kestrel__Certificates__Default__Password=你的证书密码
        ports:
          - "5001:8080"
          - "5002:8081"
        volumes:
          - ${APPDATA}/Microsoft/UserSecrets:/home/app/.microsoft/usersecrets:ro
          - ${APPDATA}/ASP.NET/Https:/home/app/.aspnet/https:ro
      demo-webapp:
        environment:
          - ASPNETCORE_ENVIRONMENT=Development
          - ASPNETCORE_HTTP_PORTS=8080
          - ASPNETCORE_HTTPS_PORTS=8081
        ports:
          - "6001:8080"
          - "6002:8081"
        volumes:
          - ${APPDATA}/Microsoft/UserSecrets:/home/app/.microsoft/usersecrets:ro
          - ${APPDATA}/ASP.NET/Https:/home/app/.aspnet/https:ro
          # 将主机的根证书导入到容器的信任存储(Linux容器)
          - ${APPDATA}/ASP.NET/Https/ca.crt:/usr/local/share/ca-certificates/ca.crt
        command: sh -c "update-ca-certificates && dotnet demo-webapp.dll"
    
  3. WebApp调用时使用服务名的HTTPS地址:
    var client = new RestClient("https://demo-catalogue-api:8081");
    var request = new RestRequest("/your-api-endpoint");
    var response = await client.GetAsync(request);
    

三、关键原理说明

  • Docker Compose会自动为所有服务创建一个内部网络,服务名可直接作为DNS名称解析到对应容器
  • 主机端口映射(如5001:8080)是给外部客户端(比如浏览器)访问用的,容器间通信无需经过主机端口
  • HTTPS证书验证要求请求的主机名与证书的主题名称或SAN扩展匹配,否则会触发SSL错误

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 20:00:27