如何分析.NET Core HttpClient请求异常(二)

【导读】上一篇我们讨论了针对项目上异常信息的具体分析而给出对应解决方案,本篇仅是我个人对相关异常信息了解过后的进一步学习和思考,希望对后续遇到此异常信息的同学们给予思路扩展

下面我们结合如下两个异常信息进行大致排查分析,到底什么时候会抛出这两个异常信息呢?.

如何分析.NET Core HttpClient请求异常(二)

如何分析.NET Core HttpClient请求异常(二)

异常信息分析

上述异常说到底还是连接问题导致,但是连接超时有很多种情况,比如客户端主动关闭连接,又比如服务端对请求应答超时等等,这里给出仅我个人理解的常见情况,大家可以作为基本参考

大前提:根据项目实际情况,分析实际业务对应场景,主要考虑以下最后两个因素

一是,适当观察下数据量大小,万一偶尔出现数据量达到M级别呢,当然既然考虑HTTP,这种情况可以基本忽略

二是,HTTP是否还能承载对应业务,排除性能瓶颈

三是,评估考虑是否增加自身平台请求超时时间设置?同时也清楚自身平台是否存在请求非常频繁?以及也一定要了解对接方是否存在处理请求非常耗时?

首先,若以上两者都不是,可以从网络原因开始分析,比如防火墙设置(根据操作系统不同而采取对应方案)、DNS解析设置(有参数可配置刷新DNS解析)、IP设置、代理设置(有参数可配置忽略代理)等等

其次,保证启用客户端持久化连接以及增加连接数限制

  //增加保活机制,表明连接为长连接
  client.DefaultRequestHeaders.Connection.Add("keep-alive");
  
  //启用保活机制(保持活动超时设置为 2 小时,并将保持活动间隔设置为 1 秒。)
  ServicePointManager.SetTcpKeepAlive(true, 7200000, 1000);
  
   //默认连接数限制为2,增加连接数限制
  ServicePointManager.DefaultConnectionLimit = 512;

然后,依然不能解决问题,尝试使用Socket通信连接

var client = new HttpClient(new SocketsHttpHandler()
{
    //考虑忽略使用代理
    UseProxy = false,
    //考虑增加连接数配置
    MaxConnectionsPerServer = 100,
    //考虑忽略重定向响应
    AllowAutoRedirect = false,
    //考虑忽略SSL证书验证
    SslOptions = new SslClientAuthenticationOptions()
    {
        RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true
    },
    //考虑数据压缩设置
    AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip,
  })
  {
      BaseAddress = new Uri(""),
      Timeout = TimeSpan.FromSeconds(30),
  };

最后,还不能解决问题,若是Windows通过WireShark抓包分析,若是Linux使用tcpdump抓包,结合WireShark分析

如果其他干扰因素都已经基本排除,同时通过WireShark抓包一切正常,是不是没辙了

自信一点,适当怀疑一下HttpClient本身可能就存在这样的问题呢?

考虑在Windows和Linux系统分别测试验证,最终确认是否是HttpClient底层在两者系统上机制的有些不同,导致存在的bug呢?