asp.net - 在本地解析Docker主机名时HttpClient花费太多时间

标签 asp.net docker asp.net-core docker-networking docker-for-windows

我们在Windows Server 16上使用Docker,但未更新1709。我们正在Docker容器内运行多个.Net-Core项目,并刚刚开始使用.Net Standard上的Selenium在这些容器上运行UI测试。我们在本地而不是在容器内运行这些测试。

我们正在使用docker-compose运行容器。撰写文件由多个服务组成,类似于以下内容:

web:
 image: web
 build:
  context: ./Web/Web
  dockerfile: Dockerfile
 hostname: web

simulator:
 image: simulator
 build:
  context: ./simulator/simulator
  dockerfile: Dockerfile
 hostname: simulator

在测试中,我们使用模拟器通过发布请求并使用REST获取对适当 Controller 的响应来模拟电子邮件激活和电话验证。我们尝试为此使用HttpClient和Refit。测试运行太慢。因此,我们寻找提高速度的方法。

然后我们将问题缩小到DNS。当我们使用在组合文件中定义的主机名时,一个简单的getAsync请求运行大约需要24秒。当我们使用容器IP地址时,只需要几毫秒。

澄清一下,这很慢:
var client = new HttpClient ("http://Simulator");
var result = client.GetAsync("controller/action");

这很快:
var client = new HttpClient ("http://172.32.40.1");  //containerIp
var result = client.GetAsync("controller/action");

此外,当我们尝试使用带有get请求的HttpClient连接到google.com时,它仍然只需要毫秒。因此,仅当我们在解决docker容器的IP时才会出现DNS问题。该问题如何解决?我既不是网络专家,也不是Docker专家,您能告诉我在哪里看吗?这是另一个WS-not-1709问题吗?

编辑:另一种情况,如果我在不处理HttpClient的情况下进行遍历,则第一个调用很慢,但随后的调用又很快。
for (int i = 0; i<SOME_LOOP_COUNT) {
    var client = new HttpClient ("http://simulator");   //slow when i == 0
    var result = client.GetAsync("controller/action");
}

最佳答案

使用“127.0.0.11”设置一个DNS解析器,这是Docker嵌入式DNS服务器

更多信息Docker docLinux doc

关于asp.net - 在本地解析Docker主机名时HttpClient花费太多时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50958248/

相关文章:

javascript - 如何在 .NET Core 中的 View 类中使用 loadjsfile?

c# - 如何在ASP.NET Core生产服务器上禁用 "Attempting to reconnect to the server"消息

javascript - 如何使用javascript启动安装flash的窗口?

c# - 在服务器端验证 recaptcha

html - 相关容器内的固定位置未按预期工作?

ubuntu - 如何使用 Ubuntu 14.04 x86 架构创建 Docker 镜像?

asp.net - LINQ 实体Where 子句位置不正确

node.js - 构建 Node 镜像: Error response from daemon: dockerfile parse error line 15: unknown instruction: CMD ["NODE",

docker - 如何检查不同 Docker 镜像层的内容?

php - 在 Azure 上运行 ASP.Net Core 和 PHP