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

问题描述 投票:0回答:1

以下代码在 .NET 控制台应用程序中工作,但在 .NET Core 控制台应用程序中不起作用。

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

操作被取消

InnerException

无法从传输连接读取数据:由于线程退出或应用程序请求,I/O 操作已中止

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);
.net-core console-application dotnet-httpclient sendasync
1个回答
2
投票

选项 1 - 增加超时

在查看这个问题时,我的第一反应是建议 .NET Framework 与 .NET Core/.NET 的默认超时是不同的。我查看了

HttpClient.Timeout
herehere)的文档,默认超时是相同的:100 秒。

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

因此,请尝试将

Timouout
设置为
TimeSpan.FromMinutes(5)
,看看会带来什么结果。这里还有一些其他资源

选项 2 - 使用 IHttpClientFactory

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

虽然该链接谈论的是原始 .NET Framework

HttpClient
,您没有有问题,但我建议您按照链接的建议进行操作,并使用
IHttpClientFactory
创建您的客户端。可能您针对原始版本“编码为错误”,并且 .NET Core 版本/做事方式已经暴露了这一点。

© www.soinside.com 2019 - 2024. All rights reserved.