Használjon egyetlen CancellationToken-t a .NET HttpClient fejléceihez és törzséhez
Vigye át a kérés CancellationToken-jét a HttpClient válasz-előkészítésén és a törzs olvasásán is, ahelyett hogy csak a hívó várakozását mérné.
A stopperóra abbahagyhatja a várakozást, miközben a HTTP-kérés folytatódik. Adjon megszakítást magának a műveletnek, amikor egy proxy-n keresztüli kísérletnek szánt időkerete van.
Egy modern .NET-alkalmazáshoz, amely már rendelkezik proxyra beállított HttpClient-tel:
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);
Ugyanaz az időkeret az előkészítés előtt indul, és aktív marad a törzs olvasása közben. A ResponseHeadersRead a fejlécek után adja vissza a vezérlést, ezért a HttpClient saját befejezési időtúllépése önmagában nem határozza meg a későbbi törzsolvasási időkeretet.
Tartsa a megszakítást elkülönítve a HTTP-állapottól és a szállítási hibáktól. Az OperationCanceledException származhat a megadott tokentől vagy egy másik beállított időtúllépéstől; vizsgálja meg az alkalmazandó megszakítási forrást, ahelyett hogy minden hibát halott proxyként jelentene.
Használja újra az ügyfelet, amely ehhez a proxy-útvonalhoz tartozik. Egy kísérlet megszakítása nem feltétlenül jelenti a teljes kapcsolatkészlet újraépítését minden későbbi kéréshez.
A példa egy véges választörzset pufferel. Egy streamelt letöltésnek át kell adnia a tokent a streammásoló ciklusán, és minden kilépési útvonalon fel kell szabadítania a választ.
A megszakítás működési szabályzatot fejez ki, nem pedig pontos valós idejű ígéretet minden mögöttes platformműveletre. Kerülje, hogy egy végtelen, Task.IsCompleted-re épülő lekérdezési ciklussal helyettesítse.