Używaj jednego CancellationToken dla nagłówków i treści .NET HttpClient
Przekazuj CancellationToken żądania zarówno do przygotowania odpowiedzi HttpClient, jak i do odczytu treści, zamiast mierzyć wyłącznie oczekiwanie wywołującego.
Stoper może przestać czekać, podczas gdy żądanie HTTP nadal trwa. Przekaż anulowanie samej operacji, gdy próba przez proxy ma założony budżet czasu.
Dla nowoczesnej aplikacji .NET z istniejącym HttpClient skonfigurowanym pod proxy:
using var budget = new CancellationTokenSource(TimeSpan.FromSeconds(5));
using var response = await client.GetAsync(
targetUrl,
HttpCompletionOption.ResponseHeadersRead,
budget.Token);
response.EnsureSuccessStatusCode();
string body = await response.Content.ReadAsStringAsync(budget.Token);
Ten sam budżet zaczyna się przed przygotowaniem i obowiązuje także podczas odczytu treści. ResponseHeadersRead oddaje sterowanie po nagłówkach, więc własny limit czasu HttpClient nie wyznacza samodzielnie późniejszego budżetu odczytu treści.
Oddziel anulowanie od statusu HTTP i błędów transportu. OperationCanceledException może pochodzić z przekazanego tokenu albo z innego skonfigurowanego limitu czasu; sprawdź właściwe źródło anulowania, zamiast zgłaszać każdy błąd jako martwe proxy.
Używaj ponownie klienta, do którego należy ta trasa proxy. Anulowanie jednej próby nie oznacza odbudowy całej puli połączeń dla każdego kolejnego żądania.
Przykład buforuje treść odpowiedzi o skończonym rozmiarze. Przy pobieraniu strumieniowym token powinien przejść przez pętlę kopiowania strumienia, a odpowiedź być zwalniana na każdej ścieżce wyjścia.
Anulowanie wyraża politykę operacji, a nie dokładną obietnicę czasu dla każdego działania platformy. Nie zastępuj go nieskończoną pętlą odpytywania Task.IsCompleted.