Cómo habilitar la transmisión
Windows Communication Foundation (WCF) puede enviar mensajes mediante transferencias almacenadas en búfer o por secuencias. En el modo de transferencia almacenado en búfer (predeterminado), se debe entregar completamente un mensaje antes de que un receptor pueda leerlo. En modo de transferencia de transmisión por secuencias, el receptor puede empezar a procesar el mensaje antes de se entregue completamente. El modo de transmisión por secuencias es útil cuando la información que se pasa es grande y puede procesarse en serie. El modo de transmisión por secuencias también es útil cuando el mensaje es demasiado grande para que se almacene en búfer completamente.
Para habilitar la transmisión por secuencias, defina apropiadamente OperationContract y habilite la transmisión por secuencias en el nivel de transporte.
Transmisión de datos por secuencias
Para transmitir datos por secuencias, OperationContract del servicio debe satisfacer dos requisitos:
- El parámetro que contiene los datos que se van a transmitir debe ser el único parámetro del método. Por ejemplo, si el mensaje de entrada es el que se va a transmitir por secuencia, la operación debe tener exactamente un parámetro de entrada. De igual forma, si el mensaje de salida se va a transmitir por secuencia, la operación debe tener exactamente un parámetro de salida o un valor devuelto.
- Al menos uno de los tipos del parámetro y el valor devuelto debería ser Stream, Messageo IXmlSerializable.
A continuación se muestra un ejemplo de los datos.
La operación
GetStream
recibe algunos datos de entrada en búfer comostring
, que también se almacena en búfer y devuelveStream
, que se transmite por secuencias. A la inversa,UploadStream
toma en unStream
(transmitido por secuencia) y devuelve unbool
(almacenado en búfer).EchoStream
toma y devuelveStream
y es un ejemplo de una operación cuyos mensajes de entrada y salida se transmiten por secuencia. Finalmente,GetReversedStream
no toma ninguna entrada y devuelve unStream
(transmitido por secuencia).La transmisión por secuencias debe habilitarse en el enlace. Defina una propiedad TransferMode, que puede adoptar uno de los siguientes valores:
- Buffered,
- Streamed, que habilita la comunicación mediante transmisión por secuencias en ambas direcciones.
- StreamedRequest, que sólo habilita la solicitud de transmisión.
- StreamedResponse, que sólo habilita la transmisión por secuencias de la respuesta.
BasicHttpBinding expone la propiedad TransferMode en el enlace, tal y como hace, NetTcpBinding y NetNamedPipeBinding. La propiedad TransferMode se puede establecer también en el elemento de enlace del transporte y utilizarse en un enlace personalizado.
Los siguientes ejemplos muestran cómo establecer TransferMode mediante código y cambiando el archivo de configuración. Ambos ejemplos también establecen la propiedad
maxReceivedMessageSize
en 64 MB, que coloca un límite en el tamaño máximo permitido de mensajes que se reciben. ElmaxReceivedMessageSize
predeterminado es de 64 KB, que normalmente es demasiado pequeño para los escenarios de transmisión por secuencias. Establezca este valor de cuota que depende, según corresponda, del tamaño máximo de mensajes que su aplicación espera recibir. También tenga en cuenta que maxBufferSize controla el tamaño máximo que se almacena en búfer y lo establece de manera apropiada.- El siguiente fragmento de código de configuración del ejemplo muestra cómo establecer la propiedad TransferMode en la transmisión por secuencias en basicHttpBinding y un enlace HTTP personalizado.
- El siguiente fragmento de código muestra cómo establecer la propiedad TransferMode para la transmisión por secuencias en basicHttpBinding y un enlace HTTP personalizado.
- El siguiente fragmento de código muestra cómo establecer la propiedad TransferMode para la transmisión por secuencias en un enlace HTTP personalizado.
Las operaciones
GetStream
,UploadStream
yEchoStream
tratan con el envío de datos directamente desde un archivo o guardando los datos recibidos directamente en un archivo. El siguiente código se aplica aGetStream
.
Escritura de una secuencia personalizada
Para hacer un procesamiento especial en cada fragmento de una secuencia de datos mientras se envía o recibe, derive una clase de secuencia personalizada de Stream. Como un ejemplo de una secuencia personalizada, el siguiente código contiene un método
GetReversedStream
y una claseReverseStream
.GetReversedStream
crea y devuelve una nueva instancia deReverseStream
. El procesamiento real se produce cuando el sistema lee desde el objetoReverseStream
. El métodoReverseStream.Read
lee un fragmento de bytes del archivo subyacente, los invierte y después devuelve los bytes invertidos. Este método no invierte el contenido del archivo completo, sino un fragmento de bytes cada vez. Este ejemplo muestra cómo puede realizar el procesamiento de la secuencia cuando el contenido se lee o escribe desde la secuencia.
Consulte también
Conceptos
Datos de gran tamaño y secuencias