Jede Möglichkeit zur Unterscheidung zwischen Abbrechen und Zeitüberschreitung
Ich habe einen Code, der einige Daten überprüft, indem er eine Reihe anderer Dienste anruft. Ich starte alle Anrufe parallel und warte dann, bis mindestens einer beendet ist. Wenn eine der Anfragen fehlschlägt, ist mir das Ergebnis der anderen Anrufe egal.
Ich telefoniere mitHttpClient
und ich habe ein @ bestandHttpMessageHandler
in das macht eine Menge Protokollierung. Im Wesentlichen
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;
}
Nein Teil, mit dem ich Probleme habe, ist, wenn ich die Anfragen storniere. Wenn ich eine Anfrage storniere, mache ich das absichtlich, damit sie nicht als Zeitüberschreitung protokolliert wird, aber es scheint keinen Unterschied zwischen einer Stornierung und einer tatsächlichen Zeitüberschreitung zu geben.
Ist es trotzdem dazu da?
Bearbeiten Ich muss das ein wenig klären. Der Dienst, der die Anrufe parallel tätigt, leitet CancellationTokens mit einer Zeitüberschreitung weiter:
var ct = new CancellationTokenSource(TimeSpan.FromSeconds(2));
Wenn der Server länger als zwei Sekunden braucht, um zu antworten, erhalte ich einOperationCanceledException
, und wenn ich die Tokenquelle manuell annulliere (z. B. weil ein anderer Server nach 1 Sekunde einen Fehler zurückgegeben hat), erhalte ich immer noch einOperationCanceledException
. Im Idealfall könnte ich mir @ ansehCancellationToken.IsCancellationRequested
, um festzustellen, ob es aufgrund einer Zeitüberschreitung abgebrochen wurde, im Gegensatz zu der expliziten Aufforderung, abgebrochen zu werden. Es scheint jedoch, dass Sie unabhängig von @ denselben Wert erhalteWi es wurde abgesagt.