期限トークンを使ってプロキシ経由の .NET HttpClient 要求を取り消す
プロキシの期限が切れたら呼び出し元の待機だけを打ち切るのではなく、ネットワーク操作そのものを取り消します。
ネットワーク処理を取り消せる操作に期限を渡します。プロキシ経由で構成済みの既存の .NET HttpClient の場合:
using var deadline = new CancellationTokenSource(TimeSpan.FromSeconds(20));
using var response = await client.GetAsync(uri, deadline.Token);アプリケーションは client と uri を提供します。このオーバーロードはキャンセル トークンを受け取ります。そのタスクの待機を囲むタイムアウトは、その呼び出し元の待機だけを制限します。完了フラグをポーリングする場合も同じ問題があります。呼び出し元が離れても、ソケットとワーカーは占有されたままです。
キャンセルはクライアントの実装とクリーンアップの経路に従います。下位のすべての処理が正確な命令で停止することを約束するものではありません。その経路を完了させ、操作が所有するリソースを解放してください。個別に制御する本文の読み取りを設計に含めます。現代の .NET ResponseHeadersRead 操作では、同じトークンを本文の読み取りまで通します。他のクライアントは独自のキャンセル、中止、クリーンアップのインターフェイスを提供します。
再試行には前回の試行の結果が必要です。その識別子と選択したプロキシを保持し、必要に応じてキャンセルを要求し、代替を無制限に開始しながらタスクを失わないようにします。そうしないと、遅いエンドポイントはアプリケーションが解放するより速く作業を蓄積する可能性があります。
リモートの結果には別個の扱いが必要です。キャンセルが発生した時点で、宛先がすでに送信を受け取っている可能性があります。アプリケーションの回復または冪等性のポリシーを使用してください。ローカルの作業を止めても、リモートの操作は取り消されません。