Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker Compose运行的Web API无法通过HTTP访问服务依赖项_Docker_Asp.net Core_Docker Compose - Fatal编程技术网

Docker Compose运行的Web API无法通过HTTP访问服务依赖项

Docker Compose运行的Web API无法通过HTTP访问服务依赖项,docker,asp.net-core,docker-compose,Docker,Asp.net Core,Docker Compose,我有一个停靠的ASP.NET Core 2.2 Web API,它依赖于另一个服务(身份提供者)进行承载令牌验证。因此,我使用VisualStudio使用Docker Compose将容器编排支持添加到我的API项目中,以使我能够使用VisualStudio在适当的依赖项下进行本地调试 Docker Compose服务如下所示: services: my.api: image: ${DOCKER_REGISTRY-}myapi build: context: .

我有一个停靠的ASP.NET Core 2.2 Web API,它依赖于另一个服务(身份提供者)进行承载令牌验证。因此,我使用VisualStudio使用Docker Compose将容器编排支持添加到我的API项目中,以使我能够使用VisualStudio在适当的依赖项下进行本地调试

Docker Compose服务如下所示:

services:
  my.api:
    image: ${DOCKER_REGISTRY-}myapi
    build:
      context: .
      dockerfile: My.Api/Dockerfile
    ports:
      - "60004:80"
    depends_on:
      - identity
  identity:
    image: "my-identity:local"
    ports:
      - "60000:80"
当我在Visual Studio中运行Docker Compose调试配置文件时,我可以看到这两个服务都已启动,因此我可以使用浏览器在处加载API的匿名端点,还可以在处查看身份提供程序的OIDC配置

但是,当我使用客户端应用程序向我的API发出授权请求并传递有效的访问令牌时,它会返回一个包含以下错误的500响应:

IDX10803:无法从获取配置:

我的假设是,两个容器API和Identity之间的服务器到服务器调用失败。我通过尝试显式向OIDC端点发出HTTP请求并返回System.Net.Sockets.SocketException 99:无法分配请求的地址异常来确认这一点


但我的理解是Docker Compose处理了相互依赖容器的所有网络复杂性。那么,我还需要做些什么来确保依赖我的身份提供者的容器可以看到它呢?

您的问题是,您试图在localhost上访问该服务。在大多数情况下,这是行不通的:localhost表示当前容器或当前主机,而您的标识服务与api服务不在同一容器中运行

在my.api容器中,您可以使用主机名标识访问您的标识服务,例如。,http://identity/.well-known/openid-configuration. 这是因为当您打开docker compose堆栈时,docker compose将默认为您的容器创建用户定义的网络。在用户定义的网络中,Docker维护一个DNS服务,该服务将容器名称映射到它们各自的地址。请注意,您需要访问容器端口80中它正在侦听的端口上的服务,而不是发布服务的主机上的端口

不需要使用服务定义中的ports键在主机端口上发布标识服务,除非您确实需要从api容器以外的其他对象访问此服务