无法解析DNS(有时?)

ebb*_*ebb 3 c# windows dns multithreading

给定一个并行请求10000个URL的同时请求100个URL的应用程序,对于其中的50-5000个,我将收到以下错误消息:

远程名称无法解析为“ www.url.com”

我了解该错误意味着DNS服务器无法解析该网址。但是,对于每次运行,无法解析的URL数量都会更改(范围从50到5000)。

我发出太多请求的速度太快了吗?而且我还能做到吗?-在功能更强大的服务器上运行相同的测试,结果表明仅10个网址无法解析-听起来更加现实。

进行并行请求的代码:

var semp = new SemaphoreSlim(100);
var uris = File.ReadAllLines(@"C:\urls.txt").Select(x => new Uri(x));

foreach(var uri in uris)
{
   Task.Run(async () =>
   {
      await semp.WaitAsync();
      var result = await Web.TryGetPage(uri); // Using HttpWebRequest
      semp.Release();
   });   
}
Run Code Online (Sandbox Code Playgroud)

spe*_*der 5

我打赌您不知道HttpWebRequest的DNS查找(这是所有.net http api的基石)是同步发生的,即使发出异步请求(烦人,对吗?)。这意味着立即触发许多请求会导致严重的ThreadPool压力和大量的延迟。这可能会导致意外的超时。如果您真的想加快步伐,请不要使用.net dns实现。您可以使用第三方库来解析主机,并使用ip而不是主机名来创建webrequest,然后在触发请求之前手动设置主机头。你可以实现多少吞吐量这样高。