背景

起因是朋友在使用深信服的 Easy Connect 连接到内网之后,使用 HttpClient 访问对应内网的 API 站点均返回 System.Net.Sockets.SocketException (10060) 异常。但使用其他语言的原生 HTTP 库,比如 Golang / Python / Java 都可以正常访问,因此怀疑是 HttpClient 的问题。

原因

经过搜索得知,这是存在于 .NET 5 及其以上版本的问题,在 .NET 3.1 是不存在这种情况的。底层原因是从 .NET 5 开始,HttpClient 的底层实现使用的是双栈套接字(Dual-Stack Sockets),在某些情况下,你的网卡获得了 IPv6 地址,但是 VPN 处于某种原因不能正确地处理 IPv6 请求时就会导致上述情况的发生。在 PR #55012 中,说明了这种情况:

Introduces an AppContext switch System.Net.DisableIPv6 and environment variable DOTNET_SYSTEM_NET_DISABLEIPV6 to emulate the lack of OS-level IPv6 support. This is useful to workaround dual-stack socket issues when the OS reports support of IPv6, but some other underlying infrastructure element (typically VPN) doesn't function well with IPv6 request.

For consistency, this switch also impacts NameResolution and Ping, not only Sockets.

解决

根据 PR 提到的信息,我们只需要在程序启动的时候使用以下代码禁用 IPv6 栈即可解决。

AppContext.SetSwitch("System.Net.DisableIPv6",true);

相关 Issue / PR:

.NET 5 以后的 HttpClient 超时问题的更多相关文章

  1. httpclient超时总结(转)

    Httpclient超时 背景: 网站这边多次因为httpclient调用超时时间没设置好导致关掉,影响非常不好,而且问题重复出现,查看网络,没有比较明确介绍httpclient所有超时相关的设置(大 ...

  2. 有趣的 Go HttpClient 超时机制

    hello,大家好呀,我是既写 Java 又写 Go 的小楼,在写 Go 的过程中经常对比这两种语言的特性,踩了不少坑,也发现了不少有意思的地方,今天就来聊聊 Go 自带的 HttpClient 的超 ...

  3. httpclient 超时设置

    最近项目客户反应超时经常出现:现已经总结超时设置: 使用是apache的HttpClient: DefaultHttpClient:请求超时httpclient.getParams().setPara ...

  4. Httpclient超时timeout设置

    一:连接超时:connectionTimeout 1:指的是连接一个url的连接等待时间. 二:读取数据超时:soTimeout 1:指的是连接上一个url,获取response的返回等待时间. Fo ...

  5. HttpClient超时设置setConnectionTimeout和setSoTimeout

    http是基于TCP/IP进行通信的,tcp通过3次握手建立连接,并最终以4次挥手终止通信. 知乎上对三次握手和四次挥手有如下解释: 作者:知乎用户链接:https://www.zhihu.com/q ...

  6. httpClient 超时时间设置(转)

    尊重博主原创,特贴博客链接.copy下来只怕以后链接失效或删掉. 转自:http://blog.csdn.net/hi_kevin/article/details/32316171 HttpClien ...

  7. HTTPClient 超时链接设置

    远程访问链接,设置时间,从而减少不必要的麻烦,但是HttpClient版本不一致,方法不一样,所以有了如下设置 原帖链接:https://www.cnblogs.com/jimmy-muyuan/p/ ...

  8. HttpClient超时设置

    场景:最近并发较高,看到响应时间6s的时候,心里咯噔一下,我记得我设置的超时时间是5s啊.   原来读取超时时间没生效,只生效了连接超时时间. ConnectionPoolTimeoutExcepti ...

  9. httpclient超时时间设置及代理设置

    超时时间 设置HttpClient的超时时间,非常有必要性,因为httpclient 默认超时时间很长,自己可以测试一下是多久,设置超时时间否则会影响自己系统的业务逻辑,例如阻塞系统,影响系统的吞吐量 ...

  10. HttpClient 超时时间

    setSoTimeout(MilSec):连接超时时间.如果在连接过程中有数据传输,超时时间重新计算. setConnectTimeout(MilSec):获取连接超时时间.如果该参数没有设置,那么默 ...

随机推荐

  1. ABP .net Core 将日志打印在控制台

    上效果图 来看一下操作流程: 一.分为.net Core 2.2 和 .net Core 3.0及以上 (一)..net Core 2.2 1.在 EntityFrameworkCore中安装Nuge ...

  2. tensorflow语法【zip、tf.tile、tf.truncated_normal、tf.data.Dataset.from_tensor_slices、dataset中shuffle()】

    相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...

  3. 【四】AI Studio 项目详解【VisualDL工具、环境使用说明、脚本任务、(四)图形化任务、在线部署及预测】PARL

    相关文章 [一]-环境配置+python入门教学 [二]-Parl基础命令 [三]-Notebook.&pdb.ipdb 调试 [四]-强化学习入门简介 [五]-Sarsa&Qlear ...

  4. socket编程 [补档-2023-07-10]

    Linux网络编程 1.socket编程 socket是一种通信机制,用于在网络中不同计算机之间进行数据传输,当然也可用用于进程间通信.在linux中,有文件描述符这么个东西,我们可以通过socket ...

  5. SpringBoot接入阿里云oss

    1.pom中添加阿里云oss坐标 <?xml version="1.0" encoding="utf-8"?> <dependencies&g ...

  6. P3089 Pogo-Cow S

    [USACO13NOV] Pogo-Cow S 题目传送门 题解 首先,一眼DP,想想怎么推状态转移方程 朴素DP 定义二维数组 \(f[i][j]\),其中第一维表示当前所在的目标点是\(i\),第 ...

  7. 从零开始的react入门教程(一),让我们从hello world开始

    壹 ❀ 引 按照之前的计划,从这个月开始,我将由浅至深更新一些react相关的技术博文.由于我目前也是react新手一名,所以文章本质上也算自己学习历程的记录,倘若这些文章能帮助到一些人那就再好不过了 ...

  8. NC24141 [USACO 2011 Dec G]Grass Planting

    题目链接 题目 题目描述 Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectio ...

  9. CentOS8-pacemaker+corosync高可用部署

    部署pacemaker yum install pacemaker pcs corosync fence-agents resource-agents 启动pcs服务 systemctl enable ...

  10. 承前启后,Java对象内存布局和对象头

    承前启后,Java对象内存布局和对象头 大家好,我是小高先生.在我之前的一篇文章<并发编程防御装-锁(基础版)>中,我简要介绍了锁的基础知识,并解释了为什么Java中的任何对象都可以作为锁 ...