데드라인 토큰으로 프록시 경유 .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 작업에서는 같은 토큰을 본문 읽기까지 전달합니다. 다른 클라이언트는 자체 취소, 중단, 정리 인터페이스를 제공합니다.
재시도에는 이전 시도의 결과가 필요합니다. 그 식별자와 선택한 프록시를 유지하고, 필요할 때 취소를 요청하며, 대체 작업을 무한정 시작하면서 작업을 잃지 않도록 하세요. 그렇지 않으면 느린 엔드포인트는 애플리케이션이 해제하는 것보다 빠르게 작업을 쌓을 수 있습니다.
원격 결과는 별도로 처리해야 합니다. 취소가 발생할 때 대상이 이미 전송을 받았을 수 있습니다. 애플리케이션의 복구 또는 멱등성 정책을 사용하세요. 로컬 작업을 중지해도 원격 작업은 되돌려지지 않습니다.