繁体   English   中英

获取 HttpClient 以中止连接

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM