我有一些代码正在通过调用其他服务来验证一些数据。我并行启动所有的调用,然后等待至少一个完成。如果任何请求失败,我不关心其他调用的结果。
我使用HttpClient
进行调用,并传递了一个执行大量日志记录的HttpMessageHandler
。基本上是这样:
protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
HttpResponseMessage response = null;
try
{
response = await base.SendAsync(request, cancellationToken);
}
catch (OperationCanceledException ex)
{
LogTimeout(...);
throw;
}
catch (Exception ex)
{
LogFailure(...);
throw;
}
finally
{
LogComplete(...);
}
return response;
}
我遇到麻烦的部分是取消请求时。当我取消请求时,我是有意这样做的,所以我不希望它被记录为超时,但似乎取消和真正的超时之间没有任何区别。
有什么办法可以实现这一点吗?
编辑:我需要澄清一下。并行进行调用的服务正在传递带有超时的CancellationTokens:
var ct = new CancellationTokenSource(TimeSpan.FromSeconds(2));
当服务器响应时间超过2秒时,我会收到一个OperationCanceledException
异常,如果我手动取消令牌源(比如因为另一个服务器在1秒后返回错误),那么我仍然会收到一个OperationCanceledException
异常。理想情况下,我可以查看CancellationToken.IsCancellationRequested
来确定是否因为超时而取消,而不是显式请求取消,但似乎无论如何取消都会得到相同的值。