.NET Core 2.1基于.NET套接字和Span <T>的新HttpClient。似乎有问题

DKh*_*naf 5 c# http .net-core

我有一个奇怪的问题,我正在尝试与.NET Core 2.1上的新HttpClient有关。从这里的这篇文章(https://blogs.msdn.microsoft.com/dotnet/2018/04/11/announcing-net-core-2-1-preview-2/)我知道HttpClient已经完全重新编写为使用其他低级库来处理HTTP请求。我想知道是否有人看到新实施的任何问题。

我看到的是一个奇怪的情况,我的应用程序(.NET Core 2.1)每隔15分钟几次(每10秒一次)向某个API发送POST请求几次,它将抛出一个异常并显示以下错误: An error occurred while sending the request.; The server returned an invalid or unrecognized response.

没有其他详细信息可用,这是我拨打电话时的一个例外:

using (var res = await _httpClient.PostAsync(uriBuilder.Uri, new StringContent(serializedRequestBody, Encoding.UTF8, "application/json")))
            {
               //Do something here
            }
Run Code Online (Sandbox Code Playgroud)

捕获的异常是System.Net.Http.HttpRequestException,它具有上述错误消息的某些内部异常。

因此,正如我提到的那样,这并非一直发生,它似乎是随机发生的,或者至少我无法辨别任何特定的模式。我只能说这些POST请求每10秒24/7发出一次,并且5%到10%之间的POST请求都会失败,但以上情况除外。

因此,使用了tcdump并将其通过管道传送到wireshark中以检查请求,以查看请求失败时实际发生的情况,而我看到的是以下内容:

在一个好的POST上,我看到:我的应用程序将请求发送到服务器,服务器将响应发送回,我的应用程序将ACK发送到服务器,服务器使用FIN,ACK进行响应。做完了 好东西。

在发生上述异常的POST上,我看到以下内容:我的应用程序将请求发送到服务器,并且几乎在我的应用程序将FIN,ACK发送到服务器之后(如几毫秒后)。

这似乎与我在应用程序日志中看到的一致,该日志表明在引发异常之前,请求持续时间为0。

所以对我来说,我的应用程序发送请求,然后由于某种原因立即关闭连接。但是,我不明白为什么会这样。我尝试比较原始HTTP请求(好的POST与不好的POST)以查看任何差异,但看不到任何差异。

最后要提到的一件事是,我只能在.NET Core 2.1上运行的应用程序中看到这一点。当我在.NET 2.0上运行我的应用程序时,没有看到此问题。同样,当我在.NET 4.5.1应用程序中使用相同的库(正在进行HTTP调用)(我使用多目标编译针对.net标准和net451的库)时,我也没有看到此问题。因此,它似乎仅影响.NET Core 2.1

关于我可以从这里去哪里的任何想法?我还有其他需要寻找的东西吗?有人将如何尝试对这类问题进行分类?

在此处输入图片说明

[编辑]我添加了wireshark输出的屏幕快照,该屏幕快照显示了服务器在客户端发送FIN,ACK之前从未响应的最后一个POST请求

[编辑] @Svek在注释中指出了有关ACK序列的内容。我认为这里可能有问题,因为(在屏幕截图中)在最后一个POST之后有一个FIN,ACK,它显示Ack = 7187,所以回头看一看,以前的FIN,ACK的序列为7186。现在,到目前为止,我对TCP或网络并不抱有任何期望,所以我可能会说完全愚蠢的话,但这是否意味着最后一个FIN,ACK(来自主机到服务器)本质上就是我的主机FIN,ACK'ing以前的FIN,ACK(从服务器到我的主机),并基本上关闭了连接。

因此,由于下一次POST使用相同的连接进行到相同的host:port,但是该连接已关闭(通过最后一个FIN,ACK),这就是为什么我永远都回不到响应的原因?