Izmantojiet vienu CancellationToken .NET HttpClient galvenēm un saturam
Pārvadiet pieprasījuma CancellationToken gan HttpClient atbildes sagatavošanā, gan satura lasīšanā, nevis mēriet tikai zvanītāja gaidīšanu.
Hronometrs var pārstāt gaidīt, kamēr HTTP pieprasījums turpinās. Ja proxy mēģinājumam ir paredzēts budžets, atcelšanu nododiet pašai darbībai.
Mūsdienīgā .NET lietojumā, kurā jau ir ar proxy konfigurēts 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);
Tas pats budžets sākas pirms sagatavošanas un darbojas arī satura lasīšanas laikā. ResponseHeadersRead atgriež vadību pēc galvenēm, tāpēc HttpClient savs pabeigšanas taimauts pats par sevi nenosaka vēlāko satura lasīšanas budžetu.
Turiet atcelšanu atsevišķi no HTTP statusa un transporta kļūdām. OperationCanceledException var nākt no nodotā marķiera vai cita konfigurēta taimauta; pārbaudiet attiecīgo atcelšanas avotu, nevis katru kļūdu uzskatiet par mirušu proxy.
Izmantojiet to pašu klientu, kuram pieder šis proxy maršruts. Mēģinājuma atcelšana nenozīmē, ka katram nākamajam pieprasījumam jāpārbūvē viss savienojumu pūls.
Piemērā tiek buferēts ierobežota izmēra atbildes saturs. Straumējot lejupielādi, marķieris jānodod straumes kopēšanas cilpai un atbilde jāatbrīvo katrā izejas ceļā.
Atcelšana izsaka darbības politiku, nevis precīzu faktiskā laika solījumu katram platformas solim. Neaizstājiet to ar bezgalīgu Task.IsCompleted aptaujas cilpu.