Любой способ различить Отмена и Тайм-аут
У меня есть некоторый код, который проверяет некоторые данные, совершая звонки в ряд других служб. Я запускаю все вызовы параллельно, а затем жду, пока не завершится хотя бы один из них. Если какой-либо из запросов не выполняется, меня не волнует результат других звонков.
Я звоню с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));
Поэтому, когда серверу требуется более двух секунд для ответа, я получаюOperationCanceledException
, и если я вручную отменяю источник токена (скажем, потому что другой сервер возвратил ошибку через 1 секунду), то я все равно получаюOperationCanceledException
, В идеале я бы мог посмотреть наCancellationToken.IsCancellationRequested
определить, было ли оно отменено из-за тайм-аута, в отличие от явного запроса на отмену, но, похоже, вы получаете одно и то же значение независимо от того,как это было отменено.