ใช้ 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 ที่ไม่มีที่สิ้นสุด