Ένα χρονόμετρο μπορεί να σταματήσει να περιμένει ενώ το αίτημα HTTP συνεχίζεται. Παρέχετε ακύρωση στην ίδια τη λειτουργία όταν μια απόπειρα μέσω διακομιστή μεσολάβησης έχει προβλεπόμενο προϋπολογισμό.

Για μια σύγχρονη εφαρμογή .NET με υπάρχον HttpClient ρυθμισμένο για διακομιστή μεσολάβησης:

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);

Ο ίδιος προϋπολογισμός ξεκινά πριν από τη ρύθμιση και παραμένει ενεργός όσο διαβάζεται το σώμα. Το ResponseHeadersRead επιστρέφει τον έλεγχο μετά τις κεφαλίδες, επομένως το ίδιο το χρονικό όριο ολοκλήρωσης του HttpClient δεν καθορίζει από μόνο του τον μεταγενέστερο προϋπολογισμό ανάγνωσης του σώματος.

Κρατήστε την ακύρωση ξεχωριστή από την κατάσταση HTTP και τα σφάλματα μεταφοράς. Ένα OperationCanceledException μπορεί να προέρχεται από το παρεχόμενο token ή από άλλο ρυθμισμένο χρονικό όριο· ελέγξτε την εφαρμοστέα πηγή ακύρωσης αντί να αναφέρετε κάθε αποτυχία ως νεκρό διακομιστή μεσολάβησης.

Επαναχρησιμοποιήστε τον πελάτη που κατέχει αυτή τη διαδρομή μέσω διακομιστή μεσολάβησης. Η ακύρωση μιας απόπειρας δεν χρειάζεται να σημαίνει ανοικοδόμηση ολόκληρης της δεξαμενής συνδέσεων για κάθε επόμενο αίτημα.

Το παράδειγμα αποθηκεύει προσωρινά ένα πεπερασμένο σώμα απόκρισης. Μια ροϊκή λήψη πρέπει να περνά το token μέσα από τον βρόχο αντιγραφής ροής και να απελευθερώνει την απόκριση σε κάθε διαδρομή εξόδου.

Η ακύρωση εκφράζει μια πολιτική λειτουργίας, όχι μια ακριβή υπόσχεση πραγματικού χρόνου για κάθε υποκείμενη ενέργεια της πλατφόρμας. Αποφύγετε να την αντικαταστήσετε με έναν ατελείωτο βρόχο δημοσκόπησης στο Task.IsCompleted.

Σχετικά άρθρα