[英]Get HttpClient to abort the connection
我正在尝试在我的开发机器上重新创建错误情况,在此 github 问题中进行了描述: https://github.com/dotnet/aspnetcore/issues/28568 。 我看到的实际错误是当我的应用程序在 Kubernetes 中运行时。 该错误的详细信息记录在此处: 处理健康检查中的错误
我试图让 HttpClient 中止连接,希望在我的 ASP.Net Core WebAPI 服务中导致System.Threading.Tasks.TaskCanceledException
。 我正在处理的文本(在上面链接的 GitHub 问题中找到)说我的问题发生了:
当客户端在请求完全处理之前断开 [s] 并且由 HttpContext.RequestAborted 取消令牌引起。
我需要在我的开发机器上重新创建这个问题。 为此,我创建了一个控制台应用程序,其中包含一个调用我的服务端点的HttpClient
。 到目前为止,我已经尝试了两种不同的方法来重新创建它。 首先我打电话:
var sendTask = httpClient.SendAsync(message, cancellationTokenSource.Token);
然后,在第一次尝试中,我打电话给:
cancellationTokenSource.Cancel();
在第二次尝试中,我取消了对Cancel
的调用并输入了这个:
httpClient.Dispose();
我将逻辑放在一个循环中并运行了很多次,但是我无法在服务中重现我正在寻找的异常( TaskCanceledException
)(令人困惑的是,当调用Cancel
时它会在客户端中抛出)。
有没有办法让HttpClient
在调用完成之前断开连接?
我意识到在我调用Cancel
之后我并没有重置我的CancellationTokenSource
。 一旦我这样做了,大约 20 次调用中就有 1 个开始在我的服务中抛出TaskCanceledException
。
以防其他人想要它(供以后参考),这是我用来生成错误的代码:
var url = "https://localhost:7249/health/liveness";
var httpClient = new HttpClient();
for (int loopIndex = 0; loopIndex < 1000; loopIndex++)
{
try
{
CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
var message = new HttpRequestMessage(HttpMethod.Get, url);
// Important: don't await this or it will cause the call to finish before continuing.
httpClient.SendAsync(message, cancellationTokenSource.Token);
cancellationTokenSource.Cancel();
}
catch (Exception e) { }
Console.WriteLine($"Next {loopIndex}");
}
Console.WriteLine("All Done");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.