.NET HttpClient üstbilgileri ve gövdesi için tek CancellationToken kullanın
İsteğin CancellationToken değerini hem HttpClient yanıt hazırlığından hem de gövde okumasından geçirin; yalnızca çağıranın beklemesini ölçmeyin.
HTTP isteği sürerken bir kronometre beklemeyi bırakabilir. Proxy denemesinin amaçlanan bir zaman bütçesi varsa iptali işlemin kendisine verin.
Zaten proxy için yapılandırılmış HttpClient kullanan modern bir .NET uygulaması için:
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);
Aynı bütçe hazırlıktan önce başlar ve gövde okunurken de etkin kalır. ResponseHeadersRead denetimi üstbilgilerden sonra geri verir; bu nedenle HttpClient'ın kendi zaman aşımı, sonraki gövde okumasının bütçesini tek başına tanımlamaz.
İptali HTTP durumundan ve aktarım hatalarından ayrı tutun. OperationCanceledException sağlanan belirteçten veya başka bir yapılandırılmış zaman aşımından gelebilir; her başarısızlığı ölü proxy olarak bildirmek yerine ilgili iptal kaynağını inceleyin.
Bu proxy yolunun sahibi olan istemciyi yeniden kullanın. Bir denemeyi iptal etmek, sonraki her istek için tüm bağlantı havuzunun yeniden kurulması gerektiği anlamına gelmez.
Örnek, sonlu boyutlu bir yanıt gövdesini arabelleğe alır. Akışlı indirmede belirteç akış kopyalama döngüsünden geçirilmeli ve yanıt her çıkış yolunda serbest bırakılmalıdır.
İptal bir işlem politikası ifade eder; her platform eylemi için kesin bir duvar saati vaadi değildir. Task.IsCompleted üzerinde sonsuz bir yoklama döngüsüyle bunu değiştirmeyin.