.NET Core HttpClient请求异常思考

[[403899]]

本文转载自微信公众号「JeffckyShare」,作者Jeffcky 。转载本文请联系JeffckyShare公众号。

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

异常信息分析

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

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

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

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

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

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

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

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

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

 
 
 
 
  1. var client = new HttpClient(new SocketsHttpHandler() 
  2.     //考虑忽略使用代理 
  3.     UseProxy = false
  4.     //考虑增加连接数配置 
  5.     MaxConnectionsPerServer = 100, 
  6.     //考虑忽略重定向响应 
  7.     AllowAutoRedirect = false
  8.     //考虑忽略SSL证书验证 
  9.     SslOptions = new SslClientAuthenticationOptions() 
  10.     { 
  11.         RemoteCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true 
  12.     }, 
  13.     //考虑数据压缩设置 
  14.     AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip, 
  15.   }) 
  16.   { 
  17.       BaseAddress = new Uri(""), 
  18.       Timeout = TimeSpan.FromSeconds(30), 
  19.   }; 

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

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

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

 

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

 

THE END