Eine .NET HttpClient-Anfrage über einen Proxy mit einem Deadline-Token abbrechen
Brechen Sie den Netzwerkvorgang selbst ab, wenn eine Proxy-Deadline abläuft, statt nur die Wartezeit des Aufrufers zu beenden.
Geben Sie die Deadline an den Vorgang weiter, der die Netzwerkarbeit abbrechen kann. Für einen vorhandenen, über einen Proxy konfigurierten .NET HttpClient:
using var deadline = new CancellationTokenSource(TimeSpan.FromSeconds(20));
using var response = await client.GetAsync(uri, deadline.Token);Die Anwendung liefert client und uri. Diese Überladung erhält das Abbruchtoken; ein Timeout um das Warten auf seine Aufgabe würde nur die Wartezeit genau dieses Aufrufers begrenzen. Das Abfragen eines Abschluss-Flags hat dasselbe Problem: Der Aufrufer kann gehen, während Sockets und Worker belegt bleiben.
Der Abbruch folgt der Implementierung des Clients und dem Bereinigungspfad. Er verspricht nicht, dass jede untergeordnete Aktion an einer exakten Anweisung stoppt. Lassen Sie diesen Pfad abschließen und geben Sie die Ressourcen frei, die der Vorgang besitzt. Beziehen Sie ein separat gesteuertes Lesen des Bodys in das Design ein; bei einem modernen .NET ResponseHeadersRead-Vorgang geben Sie dasselbe Token durch das Lesen des Bodys weiter. Andere Clients bieten eigene Schnittstellen für Abbruch, Abort und Bereinigung.
Ein Wiederholungsversuch braucht ein Ergebnis für den vorherigen Versuch. Behalten Sie dessen Kennung und den gewählten Proxy, fordern Sie bei Bedarf einen Abbruch an und vermeiden Sie, die Aufgabe zu verlieren, während Ersatz unbegrenzt gestartet wird. Sonst kann ein langsamer Endpunkt Arbeit schneller ansammeln, als die Anwendung sie freigibt.
Das entfernte Ergebnis braucht eine getrennte Behandlung. Das Ziel hat möglicherweise schon eine Übermittlung erhalten, als der Abbruch eintrat. Nutzen Sie die Wiederherstellungs- oder Idempotenzrichtlinie der Anwendung; lokale Arbeit zu stoppen macht eine entfernte Aktion nicht rückgängig.