Ich habe einige große Datendateien, die ich in Chunks von sagen wir 32kb mit einer speziell dafür entwickelten API abrufen kann. Eine Verwendung der API die folgenden sein kann:Erstellen von .Net Stream aus Datenstücken
LargeFileAPI lfa = new LargeFileAPI("file1.bin");
bool moredata = true;
List<byte[]> theWholeFile = new List<byte[]>();
while (moredata )
{
byte[] arrayRead = new byte[32768];
moredata = lfa.Read(arrayRead);
theWholeFile.Add(arrayRead);
}
Das Problem mit der oben ist, dass aus der Lektüre so viel Speicher wie die Größe der großen Datei in Anspruch nimmt (100Mb sagen wir mal). Und da ich dies als Ergebnis an einen WCF-Dienst weitergeben möchte, würde ich lieber einen Stream als Ausgabe des Dienstes verwenden.
Wie kann ich ein Stream-Objekt daraus erstellen und es als Rückgabewert an einen WCF-Dienst übergeben, ohne die gesamte Dateigröße im Speicher zu belegen?
Ich dachte an eine Klasse LargeFileStream Schaffung erben von
System.IO.Stream
und die Read-Methode außer Kraft setzen. Aber ich kann nicht herausfinden, wie man durch die Tatsache arbeitet, dass Stream.Read einen Offset-Parameter und eine Anzahl von Bytes zum Lesen benötigt, weil die API, die ich erwähnte, eine feste Anzahl von Bytes für jeden Lesevorgang lesen muss. Außerdem, was ist mit all den anderen Methoden, die ich überschreiben muss, wie Flush(), Position und was sonst noch dort ist. Was sollten sie implementieren? Ich frage, weil ich keine Ahnung habe, welche anderen Funktionen als Stream.Read() WCF aufrufen würde, wenn ich den Stream vom Client (dem Aufrufer des WCF-Dienstes) lese.
Darüber hinaus muss es serialisierbar sein, damit es ein Ausgabeparameter für einen WCF-Dienst sein kann.
Dank Jihad
Das ist genau das, was ich dachte. Ich wollte nur sicherstellen, dass ich den richtigen Weg dachte. Danke –
Wie stelle ich sicher, dass die Verbindung zu LargeFileAPI korrekt geschlossen ist. Ich habe versucht, einige Tests Datei FileStream und haben festgestellt, dass weder Dispose noch Close aufgerufen werden, wenn der WCF-Dienst nicht mehr lesen. –
WCF sollte die zurückgegebenen Streams standardmäßig zurückweisen, sofern Sie dies nicht geändert haben. Wenn Sie einen benutzerdefinierten Stream wie oben verwenden, überschreiben Sie die Dispose-Methode der Basis-Stream-Klasse und schließen Sie dort Ihre API-Verbindung. Siehe auch: http://StackOverflow.com/q/6483320/5311735 – Evk