【问题标题】:.NET: Unable to read data from the transport connection: The I/O operation has been aborted.NET:无法从传输连接读取数据:I/O 操作已中止
【发布时间】:2021-07-24 14:56:03
【问题描述】:

以下代码在 .NET 控制台应用程序中运行,但在 .NET 核心控制台应用程序中不运行。

在 .NET Core 控制台应用程序中,我收到错误消息

The operation was canceled

InnerException

Unable to read data from the transport connection: The I/O operation has been aborted because of either a thread exit or an application request
var client = new HttpClient();
            
HttpRequestMessage httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, "https://www.nseindia.com/option-chain");
httpRequestMessage.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)");
httpRequestMessage.Headers.Add("Accept", "text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
httpRequestMessage.Headers.Add("Accept-Language", "en-us,en;q=0.5");
httpRequestMessage.Headers.Add("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
var response = await client.SendAsync(httpRequestMessage);

【问题讨论】:

    标签: api .net-core console-application httpclient sendasync


    【解决方案1】:

    选项 1 - 增加超时时间

    在查看此问题时,我的第一个倾向是建议 .NET Framework 与 .NET Core/.NET 的默认超时不同。我查看了HttpClient.Timeoutherehere)的文档,默认超时时间相同:100 秒。

    我打算在这种情况下建议增加价值。即使现在知道默认值是相同的,我还是建议增加该值。可能是因为实现和/或您从两个不同客户端到达目的地的方式存在足够多的其他差异,因此更改超时可能是有意义的。

    所以尝试将Timouout 设置为TimeSpan.FromMinutes(5),然后看看你会得到什么。这里有一些其他资源

    选项 2 - 使用 IHttpClientFactory

    您的代码表明您正在创建一个客户端并在某个范围内一次性使用它,并表明您在应用程序的整个生命周期内都没有使用它。如果真是这样,你会run into issues 等套接字耗尽。

    虽然该链接谈到您没有遇到问题的原始 .NET Framework HttpClient,但我建议您遵循该链接的建议并使用 IHttpClientFactorycreate your client反而。可能是您针对原始版本“编码为错误”,而 .NET Core 版本/做事方式已经暴露了这一点。

    【讨论】:

      猜你喜欢
      • 2021-05-18
      • 2015-01-15
      • 1970-01-01
      • 2017-07-19
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多