【问题标题】:HttpClient timeouts without reasonHttpClient无故超时
【发布时间】:2021-03-17 15:22:03
【问题描述】:

在我的 .net 应用程序中,我使用 Microsoft 的 HttpClient 向服务器发送请求。在我的团队中,我们遇到了一个问题,即有几个人在没有任何已知原因的情况下对每个请求都超时。

以下代码用于发送请求:

var _httpClient = new HttpClient();
// Here are some values that are identical on each system.
var values = new Dictionary<string, string>(); 
var content = new FormUrlEncodedContent(values);
var response = await _httpClient.PostAsync("http://myservice.com/endpoint", content);

是否有任何已知问题或原因导致 httpClient 在特定系统上超时?

重要事实:通过 Postman 调用具有相同数据的相同端点适用于每个同事系统。

编辑:

错误信息是:

"由于配置了HttpClient.Timeout,请求被取消 100 秒过去了。”

在内部异常中导航时,本机错误代码为 995,而 SocketErrorCode 为 OperationAborted

我的期望:

最大之后。 5 秒内应该有 200 响应与 Json 数据。

【问题讨论】:

  • “超时”是什么意思?你有例外吗?有错误信息吗?你期待什么结果?我们需要更多信息。
  • 用更多信息编辑了我的问题。 @Fildor 这是什么意思?这不是意味着我的服务设置了一些限制吗?
  • 端口耗尽不会导致超时。在发送请求之前,它会导致另一种错误。
  • 对。那么也许 OP 应该跟踪从 / 到 PostMan 与 C# 的线路上发生了什么,并查看差异......

标签: c# .net


【解决方案1】:

好的,问题是 c# 无法解析特定系统上的 DNS 名称,而 Postman 可以...

【讨论】:

  • 不,不是这样。 DNS 解析由操作系统执行,而不是 Postman 或 C#。您遇到了 DNS 问题,但仍然不知道原因。 也许您发布的不是真正的代码,_httpClient 是一个包含长期存在的 HttpClient 实例的字段。也许,DNS 条目已更改,因此 HttpClient 使用的 IP 地址和套接字现在无效。这就是为什么你应该使用 HttpClientFactory 而不是静态/长期存在的 HttpClient
  • HttpClient 速度快的原因是它只执行一次 DNS 解析,然后缓存为第一次调用创建的网络套接字。 DNS 解析slooow,最多可能需要 15 秒。缓存套接字会带来巨大的性能优势。但是,如果 DNS 条目发生更改,在负载平衡的 Web 应用程序中或在故障转移的情况下非常很常见,则套接字将指向错误的 IP。 HttpClientFactory 创建 HttpClient 实例,这些实例使用由 HttpClientFactory 管理且更重要的是 回收 的套接字池。这样,如果 DNS 更改,新 IP 将在 10 分钟内获取
猜你喜欢
  • 2022-08-05
  • 1970-01-01
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 2011-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多