¿Es correcto que en WCF, no puedo tener un servicio escriba en una secuencia que recibe el cliente?WCF y solicitudes y respuestas de transmisión
Streaming es compatible con WCF para solicitudes, respuestas o ambos. Me gustaría respaldar un escenario en el que el generador de datos (ya sea el cliente en caso de solicitud transmitida o el servidor en caso de transmisión de la respuesta) pueda Escribir en la transmisión. ¿Esto es compatible?
La analogía es Response.OutputStream de una solicitud de ASP.NET. En ASPNET, cualquier página puede invocar a Write en la secuencia de salida y el cliente recibe el contenido. ¿Puedo hacer algo similar en un servicio WCF? ¿Invocar Write en una transmisión que recibe el cliente?
Permítanme explicarlo con una ilustración de WCF. El ejemplo más simple de Streaming en WCF es el servicio que devuelve un FileStream a un cliente. Esta es una respuesta transmitida. El código de servidor para implementar esto, es así:
[ServiceContract]
public interface IStreamService
{
[OperationContract]
Stream GetData(string fileName);
}
public class StreamService : IStreamService
{
public Stream GetData(string filename)
{
return new FileStream(filename, FileMode.Open)
}
}
Y el código de cliente es la siguiente:
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);
(ejemplo tomado de http://blog.joachim.at/?p=33)
Claro, ¿verdad? El servidor devuelve Stream al cliente y el cliente invoca Read on it.
¿Es posible que el cliente proporcione un Stream y el servidor para invocar Write en él?
En otras palabras, en lugar de un modelo de extracción, donde el cliente extrae datos del servidor, se trata de un modelo push, donde el cliente proporciona la secuencia "sumidero" y el servidor escribe en ella. El código del lado del servidor puede tener un aspecto similar a este:
[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);
}
}
Es esto posible en WCF, y si es así, ¿cómo? ¿Cuáles son los ajustes de configuración necesarios para el enlace, la interfaz, etc.? ¿Cuál es la terminología?
Quizás solo funcione? (No lo he probado)
Gracias.
PD Debería haber agregado la respuesta: hacer un balance de la cantidad de datos que realmente se necesita transmitir. Esto es útil para varios MB o más, pero si solo tiene unos pocos KB para enviar, costaría menos crear un 'MemoryStream' para que el componente lo escriba y luego devolverlo. – Aaronaught
Whoa, sí !. Ahora déjame entender esto. Por favor confirmar; (1) El Stream de AnonymousPipe {Client, Server} es un par de clases que se usarán solo en el servidor. (2) Lo que se devuelve al cliente es un System.IO.Stream. – Cheeso
ps: He hecho esta pregunta antes, vea http://stackoverflow.com/questions/1499520. Estoy muy contento de obtener una respuesta general simple. – Cheeso