გამოიყენეთ ერთი CancellationToken .NET HttpClient-ის სათაურებსა და სხეულზე
გადაიტანეთ მოთხოვნის CancellationToken როგორც HttpClient-ის პასუხის მომზადებაში, ისე სხეულის წაკითხვაში, ნაცვლად მხოლოდ გამომძახებლის ლოდინის გაზომვისა.
წამზომს შეუძლია ლოდინი შეწყვიტოს, სანამ 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 შეიძლება მოვიდეს მოწოდებული ტოკენიდან ან სხვა კონფიგურირებული დროის ლიმიტიდან; შეამოწმეთ შესაბამისი გაუქმების წყარო, ნაცვლად ყოველი წარუმატებლობის მკვდარ პროქსიდად მოხსენებისა.
ხელახლა გამოიყენეთ კლიენტი, რომელიც ფლობს ამ პროქსის მარშრუტს. მცდელობის გაუქმება სულაც არ ნიშნავს მთელი კავშირების პულის ხელახლა აშენებას ყოველი შემდგომი მოთხოვნისთვის.
მაგალითი ბუფერავს სასრულ პასუხის სხეულს. ნაკადოვანი ჩამოტვირთვა ტოკენი უნდა გაატაროს თავისი ნაკადის კოპირების ციკლით და გაათავისუფლოს პასუხი ყოველ გასასვლელ გზაზე.
გაუქმება გამოხატავს ოპერაციის პოლიტიკას და არა ზუსტ კედლის საათის დაპირებას ყოველი ფონური პლატფორმის მოქმედებისთვის. მოერიდეთ მის შეცვლას Task.IsCompleted-ზე დაფუძნებული უსასრულო გამოკითხვის ციკლით.