System.Net.HttpClient-调用GetAsync

时间:2018-07-31 23:09:23

标签: dotnet-httpclient system.net

我们有一个由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的调用似乎花费了很长时间。

任何人都知道这里发生了什么,或者是否有更多调试信息可以打开以了解更多信息?

1 个答案:

答案 0 :(得分:1)

一些想法-

  • 检查在主机上禁用了IPv6。听起来好像有时尝试通过可能与伪造的DNS服务器相关联的IPv6尝试进行初始DNS查找(可能在缓存的记录TTL过期时发生)(检查您的IP配置,并测试ping {fqdn} -6是否有效。 ...或如上所述将其禁用)

  • DNS在这里可能是一个红色鲱鱼,真正的问题是您达到了最大连接限制。在很多地方都可能发生这种情况,但是要检查两个容易的事情-首先,请确保您没有为每个调用重新创建/部署HttpClient。...它应该是静态的。其次,如果每秒建立的TCP连接数量超过100,请考虑增加ServicePointManager的最大连接限制