【问题标题】:Unable to call external api from webaplication hosted in docker无法从 docker 中托管的 webaplication 调用外部 api
【发布时间】:2019-04-25 08:26:11
【问题描述】:

我的 web 应用程序在 docker 上运行并尝试调用托管在 IIS 上的外部 api,但我无法访问外部 api。抛出以下错误:但是当我的 web 应用程序在本地 iis 上运行时,然后能够连接 api 并获得响应。请帮我解决这个问题。

InnerException {System.Net.Http.HttpRequestException: 不知道这样的主机 ---> System.Net.Sockets.SocketException: 在 System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32) 上不知道这样的主机端口,在此处输入图像描述 CancellationToken cancelToken) --- 内部异常堆栈跟踪结束 --- 在 System.Net.Http.ConnectHelper.ConnectAsync(String host, Int32 port, CancellationToken cancelToken) at System.Threading.Tasks.ValueTask1.get_Result () 在 System.Net.Http.HttpConnectionPool.CreateConnectionAsync(HttpRequestMessage request, CancellationToken cancelToken) 在 System.Threading.Tasks.ValueTask1.get_Result() 在 System.Net.Http.HttpConnectionPool.WaitForCreatedConnectionAsync(ValueTask1 creationTask) 在 System.Threading。 System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage request, Boolean doRequestAuth, CancellationToken cancelToken) 上 System.Net.Http.RedirectHandler.SendAsync(HttpRequestMe) 的 Tasks.ValueTask1.get_Result() System.Net.Http.HttpClient.FinishSendAsyncUnbuffered(Task1 sendTask, HttpRequestMessage request, CancellationTokenSource cts, Boolean disposeCts) 在 System.Net.Http.HttpClient.GetStringAsyncCore(Task1 getTask)} System.Exception {System. Net.Http.HttpRequestException}

【问题讨论】:

    标签: .net docker asp.net-web-api asp.net-core .net-core


    【解决方案1】:

    对于 macOS 和 Windows,您可以尝试host.docker.internal

    localhost 替换为host.docker.internal

            public async Task<IActionResult> About()
        {
            //ViewData["Message"] = "Your application description page.";
            HttpClient client = new HttpClient();
            //var result = await client.GetStringAsync(@"http://localhost/IISWindows/home/test");
            var result = await client.GetStringAsync(@"http://host.docker.internal/IISWindows/home/test");
            ViewData["Message"] = result;
            return View();
        }
    

    如果您在 linux 中运行 docker,您可以尝试构建一个新容器来将请求重定向到主机,有关更多信息,请参阅docker-host

    【讨论】:

      【解决方案2】:

      我认为问题在于 Docker DNS 服务器。您可以尝试使用真实的DNS服务器,例如8.8.8.8

      如果您在 Windows 上使用 Docker,可以尝试更新 DNS 设置 8.8.8.8

      如果你使用的是 Ubuntu,你可以试试这个设置:

      # /etc/docker/daemon.json
      {
          "dns": ["8.8.8.8"]
      }
      

      【讨论】:

      • 感谢 Khai 的支持,但在我的情况下,我的机器被阻止从 docker 容器调用任何外部 api。所以我们的安全团队将我的机器添加到 docker 异常列表中,然后开始工作,但需要一点时间才能得到响应。
      • 任何解决方案?
      猜你喜欢
      • 1970-01-01
      • 2021-12-17
      • 2016-10-08
      • 1970-01-01
      • 1970-01-01
      • 2014-06-29
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      相关资源
      最近更新 更多