Ist es richtig, dass in WCF kann ich keinen Dienst schreiben zu einem Stream, der vom Client empfangen wird?WCF und Streaming-Anforderungen und Antworten
Streaming wird in WCF für Anfragen, Antworten oder beides unterstützt. Ich möchte ein Szenario unterstützen, in dem der Datengenerator (entweder der Client im Falle einer gestreamten Anfrage oder der Server im Falle einer gestreamten Antwort) in den Stream schreiben kann. Wird das unterstützt?
Die Analogie ist der Response.OutputStream von einer ASP.NET-Anfrage. In ASPNET kann jede Seite Write im Ausgabestream aufrufen, und der Inhalt wird vom Client empfangen. Kann ich in einem WCF-Dienst etwas Ähnliches tun? - Write auf einen Stream, der vom Client empfangen wird?
Lassen Sie mich mit einer WCF Illustration erklären. Das einfachste Beispiel für Streaming in WCF ist der Dienst, der einen FileStream an einen Client zurückgibt. Dies ist eine gestreamte Antwort. Der Server-Code, dies zu implementieren, ist wie folgt:
[ServiceContract]
public interface IStreamService
{
[OperationContract]
Stream GetData(string fileName);
}
public class StreamService : IStreamService
{
public Stream GetData(string filename)
{
return new FileStream(filename, FileMode.Open)
}
}
Und der Client-Code ist wie folgt:
StreamDemo.StreamServiceClient client =
new WcfStreamDemoClient.StreamDemo.StreamServiceClient();
Stream str = client.GetData(@"c:\path\on\server\myfile.dat");
do {
b = str.ReadByte(); //read next byte from stream
...
} while (b != -1);
(Beispiel aus http://blog.joachim.at/?p=33)
Klar, nicht wahr? Der Server gibt den Stream an den Client zurück, und der Client ruft Read darauf auf.
Ist es möglich, dass der Client einen Stream bereitstellt und der Server Write darauf aufruft?
Anders als ein Pull-Modell - wo der Client Daten vom Server bezieht - ist es ein Push-Modell, bei dem der Client den "Sink" -Stream bereitstellt und der Server in ihn schreibt. Der serverseitige Code sieht etwa so aus:
[ServiceContract]
public interface IStreamWriterService
{
[OperationContract]
void SendData(Stream clientProvidedWritableStream);
}
public class DataService : IStreamWriterService
{
public void GetData(Stream s)
{
do {
byte[] chunk = GetNextChunk();
s.Write(chunk,0, chunk.Length);
} while (chunk.Length > 0);
}
}
Ist dies in WCF möglich, und wenn ja, wie? Welche Konfigurationseinstellungen sind für die Bindung, die Schnittstelle usw. erforderlich? Wie ist die Terminologie?
Vielleicht wird es einfach funktionieren? (Ich habe es nicht versucht)
Danke.
PS Ich hätte in der Antwort hinzufügen sollen - eine Bestandsaufnahme darüber machen, wie viele Daten wirklich gestreamt werden müssen. Dies ist nützlich für mehrere MB oder mehr, aber wenn Sie nur ein paar KB zu senden haben, würde es weniger kosten, einfach einen 'MemoryStream' zu erstellen, auf den Ihre Komponente schreiben und dann zurückgeben kann. – Aaronaught
Whoa, ja !. Lass mich das jetzt verstehen. Bitte bestätigen; (1) AnonymousPipe {Client, Server} Stream ist ein Paar Klassen, die nur serverseitig verwendet werden. (2) Was an den Client zurückgegeben wird, ist ein System.IO.Stream. – Cheeso
ps: Ich habe diese Frage schon einmal gestellt, siehe http://stackoverflow.com/questions/1499520. Ich bin sehr erfreut, eine allgemeine, einfache Antwort zu bekommen. – Cheeso