我有一个奇怪的问题,我正在尝试与.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),这就是为什么我永远都回不到响应的原因?
| 归档时间: |
|
| 查看次数: |
417 次 |
| 最近记录: |