我们有一个由IIS 8.5托管的ASP.NET应用程序(.NET 4.5.2)。它可以调用驻留在同一台计算机上的多个Web服务。我们使用HttpClient来调用Web服务,并使用服务器的FQDN来寻址Web服务。在任何给定时间,可能有多个用户连接到服务器。
我们在应用程序中看到了一些莫名其妙的超时,并试图了解如何解决它。我们已经在System.Net跟踪中隔离了该问题,但我不知道如何将其映射到应用程序中可能发生的情况。
我们总是看到大致像这样的痕迹:
System.Net Verbose: 0 : [7040] ServicePoint#54409111::ServicePoint([fqdn]:443)
DateTime=2018-07-31T14:19:39.8579341Z
System.Net Information: 0 : [7040] Associating HttpWebRequest#63284140 with ServicePoint#54409111
DateTime=2018-07-31T14:19:39.8579341Z
System.Net Information: 0 : [7040] Associating Connection#66464819 with HttpWebRequest#63284140
DateTime=2018-07-31T14:19:39.8579341Z
System.Net.Sockets Verbose: 0 : [7040] Socket#15069449::Socket(AddressFamily#2)
DateTime=2018-07-31T14:19:39.8579341Z
System.Net.Sockets Verbose: 0 : [7040] Exiting Socket#15069449::Socket()
DateTime=2018-07-31T14:19:39.8579341Z
System.Net.Sockets Verbose: 0 : [7040] Socket#36384690::Socket(AddressFamily#23)
DateTime=2018-07-31T14:19:39.8579341Z
System.Net.Sockets Verbose: 0 : [7040] Exiting Socket#36384690::Socket()
DateTime=2018-07-31T14:19:39.8579341Z
System.Net.Sockets Verbose: 0 : [7040] DNS::TryInternalResolve([fqdn])
DateTime=2018-07-31T14:19:39.8579341Z
System.Net.Sockets Verbose: 0 : [7040] Socket#36384690::BeginConnectEx()
DateTime=2018-07-31T14:19:39.8579341Z
System.Net.Sockets Verbose: 0 : [7040] Socket#36384690::InternalBind([::]:0#-1630021378)
DateTime=2018-07-31T14:19:39.8579341Z
System.Net.Sockets Verbose: 0 : [7040] Exiting Socket#36384690::InternalBind()
DateTime=2018-07-31T14:19:39.8579341Z
System.Net.Sockets Verbose: 0 : [7040] Exiting Socket#36384690::BeginConnectEx() -> ConnectOverlappedAsyncResult#20281278
DateTime=2018-07-31T14:19:39.8579341Z
System.Net Verbose: 0 : [7040] Exiting HttpWebRequest#63284140::BeginGetResponse() -> ContextAwareResult#61049080
DateTime=2018-07-31T14:19:39.8579341Z
System.Net.Sockets Verbose: 0 : [1988] Socket#36384690::EndConnect(ConnectOverlappedAsyncResult#20281278)
DateTime=2018-07-31T14:20:00.8591809Z
System.Net.Sockets Error: 0 : [1988] Socket#36384690::UpdateStatusAfterSocketError() - TimedOut
DateTime=2018-07-31T14:20:00.8591809Z
System.Net.Sockets Error: 0 : [1988] Exception in Socket#36384690::EndConnect - A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond [fe80::10f8:605a:8a44:5f1e%12]:443.
DateTime=2018-07-31T14:20:00.8591809Z
在每次发生此超时的每种情况下,我们都会看到以下调用序列: DNS :: TryInternalResolve 然后: 套接字########## :: InternalBind([::]:0#-1630021378)
在成功的连接中,我们看到: :: InternalBind(0.0.0.0:0#0) 没有呼叫来解析DNS
奇怪的是,应用程序永远不会看到任何错误。到HttpClient的调用似乎花费了很长时间。
任何人都知道这里发生了什么,或者是否有更多调试信息可以打开以了解更多信息?
答案 0 :(得分:1)
一些想法-
检查在主机上禁用了IPv6。听起来好像有时尝试通过可能与伪造的DNS服务器相关联的IPv6尝试进行初始DNS查找(可能在缓存的记录TTL过期时发生)(检查您的IP配置,并测试ping {fqdn} -6是否有效。 ...或如上所述将其禁用)
DNS在这里可能是一个红色鲱鱼,真正的问题是您达到了最大连接限制。在很多地方都可能发生这种情况,但是要检查两个容易的事情-首先,请确保您没有为每个调用重新创建/部署HttpClient。...它应该是静态的。其次,如果每秒建立的TCP连接数量超过100,请考虑增加ServicePointManager的最大连接限制