我有一个委托处理程序,它根据从服务器收到的错误消息引发特定异常。这允许客户端重试(使用 polly,但如您所见,机制无关紧要(两次尝试失败后,第三次尝试将挂起。没有数据到达服务器,也没有进一步的事情发生。这似乎是因为 HttpClient 最多有两个连接,这表明这些连接没有正确关闭。我可以做些什么来关闭连接,或者我应该更改设计以使委派处理程序不会引发异常?
请参阅下面的简单示例以重现
private class Test : DelegatingHandler
{
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var response = await base.SendAsync(request, cancellationToken);
throw new Exception("afesaf");
}
}
[HttpGet]
[Route("B")]
public async Task B()
{
var handler = new HttpClientHandler();
var pipeline = HttpClientFactory.CreatePipeline(handler, new[] { new Test() });
var http = new HttpClient(pipeline);
http.BaseAddress = new Uri("http://google.com");
var count = 0;
while (count++ < 5)
try
{
Log.Info("A");
var request = new HttpRequestMessage(HttpMethod.Get, "");
await http.SendAsync(request, HttpCompletionOption.ResponseContentRead, CancellationToken.None).ConfigureAwait(false);
}
catch
{
}
}
释放
响应对象。
我在委派处理程序中使用了以下内容,因为我有多个点可以在实际代码中抛出异常
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
HttpResponseMessage response = null;
try
{
response = await base.SendAsync(request, cancellationToken);
throw new Exception("afesaf");
}
catch
{
response?.Dispose();
throw
}
}