.NET:无法从传输连接读取数据:I/O 操作已中止

问题描述

以下代码适用于 .NET 控制台应用程序,但不适用于 .NET core 控制台应用程序。

在 .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);

解决方法

选项 1 - 增加超时

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

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

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

选项 2 - 使用 IHttpClientFactory

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

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