Dies ist ein Problem, das ich in der letzten Woche untersucht habe und keine Lösung finden kann. Gefundene Beiträge, die dasselbe fragen, aber nie eine Antwort bekommen, hoffentlich hilft das auch anderen.Wie kann ich einen Stream vom WCF-Dienst abbrechen, ohne ihn zu Ende zu lesen?
Ich habe einen WCF
Service, der ein Objekt zurückgibt, das eine stream
darin enthält. Ich verwende basicHttpBinding
mit Streaming-Übertragung und Mtom, um es an den Client zu senden.
Client ruft den Dienst WCF
auf und schließt den Proxy sofort, nachdem er das Antwortobjekt empfangen hat.
Als Nächstes liest der Client den vom WCF-Dienst empfangenen Stream und schreibt ihn in eine Datei auf dem lokalen Datenträger. All das funktioniert gut.
Mein Problem ist, wenn der Client den Vorgang abbrechen und das Herunterladen der Daten vom WCF-Dienst beenden möchte. Wenn ich .close()
im Stream aufrufen, z. B .: serverReply.DataStream.Close();
dann blockiert und liest es den gesamten Stream vom WCF-Dienst bis zu seinem Ende, bevor er fortfährt. Der Stream kann ziemlich groß sein und das Netzwerk ist nicht immer schnell.
Dies ist sehr unerwünscht für die Nutzung der Netzwerkressourcen, die im Grunde für Daten verschwendet wird, die nicht mehr verwendet werden. Und da basicHttpBinding
nur zwei gleichzeitige TCP-Verbindungen (standardmäßig) zum WCF-Dienstserver zulässt, blockiert es andere Verbindungsversuche, bis der Stream bis zum Ende gelesen wird.
Ich könnte die Anzahl der gleichzeitigen Verbindungen erhöhen, aber das wäre eine schlechte Lösung, da es eine Öffnung für Probleme erstellen würde.
Zum Beispiel, 20 abgebrochene Downloads, die noch die Daten herunterladen, um es wegzuwerfen. Ich muss die Übertragung komplett stoppen.
Auf dem Client ist das Stream-Objekt nur eine reguläre Stream
Klasse, also hat es nur die close-Methode, sonst nichts.
Das Aufrufen von .close()
oder .abort()
auf dem Proxy-Objekt hilft nicht, noch zerstört es mit .dispose()
oder einer anderen Methode. Auf der Serverseite handle ich das OperationContext.OperationCompleted
Ereignis, aber es wird nicht ausgelöst, bis die Daten von stream
bis zum Ende gelesen werden.
Die Frage ist also, wie schließe ich den Stream, ohne ihn komplett zu lesen?
Haben Sie Glück dabei? – Schultz9999
Das gleiche Problem beim Senden von wirklich großen Dateien zu leiden ... scheint, als müsste etwas wirklich Offensichtliches fehlen. Ich werde wahrscheinlich Chunking als Workaround implementieren müssen. –