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

ASP.NET Core 8 Docker化项目中gRPC客户端调用连接拒绝问题

解决gRPC服务调用"Connection refused"问题

核心问题分析

出现Connection refused错误的核心原因是Basket.API调用gRPC服务时使用了错误的端口。Docker容器内部,Discount.Grpc服务监听的是8080端口(ASP.NET Core 8镜像默认端口),但客户端配置仅指定了服务名http://discount.grpc,默认会尝试连接80端口,而该端口未被监听,导致连接失败。

解决方案步骤

1. 修正gRPC客户端调用地址

更新docker-compose.override.yml中Basket.API的环境变量,添加容器内部的监听端口8080:

basket.api:
    container_name: basket.api
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - "GrpcSettings:DiscountUrl=http://discount.grpc:8080"  # 补充容器内部监听端口
    ports:
      - "8001:8080"

discount.grpc:
    container_name: discount.grpc
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - "DatabaseSettings:ConnectionString=Server=discountdb;Port=5432;Database=DiscountDb;User Id=admin;Password=***;"
    ports:
      - "8003:8080"

2. 修正Discount.Grpc Dockerfile的EXPOSE声明

Dockerfile中EXPOSE的端口应与容器内部服务实际监听的端口一致(8080),避免混淆:

FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER app
WORKDIR /app
EXPOSE 8080  # 从8003改为容器内部实际监听的8080端口

FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["Services/Discount/Discount.Grpc/Discount.Grpc.csproj", "Services/Discount/Discount.Grpc/"]
RUN dotnet restore "./Services/Discount/Discount.Grpc/./Discount.Grpc.csproj"
COPY . .
WORKDIR "/src/Services/Discount/Discount.Grpc"
RUN dotnet build "./Discount.Grpc.csproj" -c $BUILD_CONFIGURATION -o /app/build

FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./Discount.Grpc.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "Discount.Grpc.dll"]

3. 验证服务状态与连通性

  • 查看Discount.Grpc启动日志:

    docker logs discount.grpc
    

    确认日志中包含Now listening on: http://[::]:8080类信息,说明服务已正确绑定到8080端口。

  • 测试容器间网络连通性:
    进入Basket.API容器,尝试访问Discount.Grpc服务:

    docker exec -it basket.api curl http://discount.grpc:8080
    

    若返回gRPC的405 Method Not Allowed页面(正常现象,gRPC需HTTP/2协议调用),则说明网络连通正常。

4. 重启容器生效

修改配置后,重启所有容器使设置生效:

docker-compose -f .\docker-compose.yml -f .\docker-compose.override.yml down
docker-compose -f .\docker-compose.yml -f .\docker-compose.override.yml up --build

额外检查点

  • 确认Discount.Grpc的appsettings.json中Kestrel配置正确启用HTTP/2:
    {
      "Kestrel": {
        "EndpointDefaults": {
          "Protocols": "Http2"
        }
      }
    }
    
  • Docker Compose默认会为所有服务创建并加入同一个网络,无需额外配置,确保两个服务未被隔离到不同网络。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 23:32:08