我们在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获得对适当控制器的响应来模拟电子邮件激活和电话验证。我们尝试为此使用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");
此外,当我们尝试使用带有获取请求的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");
}