2010-08-29 13 views
8

Ich habe einen WCF-Dienst, der große (10 bis 20 Millionen) Objekte aus der Datenbank lesen muss.Streamen einer unbestimmten Anzahl von Objekten über WCF

Was ich gerne tun würde, ist, dass der Client einen Stream öffnet und der Server Daten aus der Datenbank pushen lässt, während er liest.

So könnte der Client einfach in einer Schleife deserializing Nachrichten sitzen, bis es die EOF-Nachricht vom Server erhält, im Stil der Twitter Streaming API, aber mit einer endlichen Menge. Das Problem, das ich habe, ist, wie man den Stream zurückgibt und dann weiter schreibt. Ist das mit WCF möglich?

Antwort

2

Wie wäre es mit der Einrichtung eines Streaming/Blocking-Dienstes, die Sie verwenden, wie WS Dual Http. Damit haben Sie einen asynchronen bidirektionalen Callback-Kanal, mit dem Sie Informationen zwischen dem Server und dem Client anfordern/beantworten können. Probleme, die Sie sehen können, wenn Sie den gesamten Satz streamen möchten, ist eine normale Art, dass einige der Ressourcen andere Anforderungen (oder Timeouts) blockieren, während andere Benutzer versuchen, auf den Dienst zuzugreifen.

+0

WS Dual Http erlaubt überhaupt kein Streaming. Aber im Allgemeinen hast du recht. Wahrscheinlich ist die einzige Möglichkeit, solche Kommunikation in WCF zu simulieren, eine bidirektionale gestreamte Net.TCP-Verbindung zu öffnen (nicht sicher, ob diese Kombination möglich ist). Anstatt einen einzelnen Stream zurückzugeben, verwenden Sie den Client-Callback, um den Datensatz zu senden. –

+0

Ich habe nicht gesagt, dass Streaming erlaubt ist. Ich versuche zu sagen, dass es wahrscheinlich eine bessere Option als Streaming ist. Sie können in WCF streamen, aber E/A für andere ankommende Anfragen blockieren. Es ist keine gute Wahl, wenn es um die Skalierung geht. Darüber hinaus möchten die meisten in Serialisierer integrierten die gesamte Nachricht downloaden, bevor sie den Inhalt deserialisieren. –

+0

Wäre es besser, wenn ich nur einen HttpHandler verwende und so in den Stream schreibe? Ich muss über HTTP gehen, da dies ein externer Webservice ist. Habe einen Blick auf deine Lösung geworfen Matt und es sieht gut aus, aber ich habe vergessen zu erwähnen, dass wir vielleicht Leute benutzen, die das von außerhalb der WCF benutzen, also würde ich annehmen, dass ich die HttpHandler-Route gehen müsste? Ich bin nicht unbedingt an die WCF gebunden, ich frage mich nur, ob das möglich ist. Wenn es also andere bessere Möglichkeiten gibt, bin ich für sie offen. Danke, dass Sie sich die Zeit genommen haben, meine Frage zu beantworten. –

0

Das Problem besteht darin, dass WCF keinen Antwort-Stream für den Vorgang bereitstellt. Der aus der Operation zurückgegebene Stream ist nur ein "Inhalt" einer Nachricht. Ich versuchte, WCF mit einigen Threading-Szenarien zu tricksen, wo ich MemoryStream zurückgab und versuchte, es aus anderem Thread zu füllen, aber wie erwartet, hat es nicht funktioniert.

Erwähnte HttpHandler ist der einzige Weg zu gehen.

0

Vielleicht möchten Sie einen Blick auf die PollingDuplexHttpBinding werfen (Notice ID Mai könnte :-)).

Einige mögen diese Bindung nicht sehr, aber ich hatte nach der anfänglichen Hürde, die Konfiguration richtig zu machen, nicht allzu viele Probleme damit.

Es könnte sicherlich die Arbeit tun, die ich denke, da es wenig mehr ist als der "lange Polling-Trick" in Web-Sockets verwendet, wie ich es verstehe.

HTH.

Verwandte Themen