นาฬิกาจับเวลาหยุดรอได้ในขณะที่คำขอ 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 ที่ไม่มีที่สิ้นสุด

บทความที่เกี่ยวข้อง