Transferencia de mensajes por secuencias

Los transportes de Windows Communication Foundation (WCF) admiten dos modos para transferir los mensajes:

  • Las transferencias almacenadas en búfer contienen el mensaje completo en un búfer de memoria hasta que la transferencia haya finalizado. Un mensaje almacenado en búfer debe entregarse por completo antes de que un receptor pueda leerlo.

  • Las transferencias por secuencias exponen el mensaje como una secuencia. El receptor inicia a procesar el mensaje antes de que se haya entregado por completo.

  • Las transferencias por secuencias pueden mejorar la escalabilidad de un servicio eliminando el requisito de grandes búferes de memoria. La mejora de la escalabilidad mediante el cambio del modo de transferencia depende del tamaño de los mensajes que se estén transfiriendo. Los tamaños de mensaje grandes favorecen el uso de transferencias por secuencias.

De forma predeterminada, los transportes HTTP, TCP/IP, y de canalización con nombre usan transferencias almacenadas en búfer. En este documento se describe cómo intercambiar estos transportes desde un modo de transferencia almacenado en búfer hasta otro de transferencia por secuencias y las consecuencias de ello.

Habilitación de transferencias por secuencias

La selección entre los modos de transferencia mediante búfer y mediante secuencias se realiza en el elemento de enlace del transporte. El elemento de enlace tiene una propiedad TransferMode que puede establecerse en Buffered, Streamed, StreamedRequesto StreamedResponse. Establecer el modo de transferencia en Streamed habilita la comunicación de transmisión por secuencias en ambas direcciones. Establecer el modo de transferencia en StreamedRequest o StreamedResponse habilita la comunicación de la transmisión por secuencias solo en la dirección indicada.

Los enlaces BasicHttpBinding, NetTcpBinding, y NetNamedPipeBinding exponen la propiedad TransferMode. Para otros transportes, debe crear un enlace personalizado para establecer el modo de transferencia.

La decisión de utilizar transferencias almacenadas en búfer o secuenciadas es una decisión específica del extremo. En los transportes HTTP, el modo de transferencia no se propaga a través de una conexión o a los servidores y otros intermediarios. El establecimiento del modo de transferencia no se refleja en la descripción de la interfaz de servicio. Después de generar una clase de cliente para un servicio, debe modificar el archivo de configuración de los servicios pensados para ser utilizados con transferencias por secuencias para establecer el modo. En los transportes con canalizaciones con nombre y TCP, el modo de transferencia se propaga como una aserción de directiva.

Para consultar muestras de código, vea Cómo habilitar la transmisión.

Restricciones en transferencias por secuencias

El uso del modo de transferencia por secuencias hace que el tiempo de ejecución exija restricciones adicionales.

Las operaciones que se producen en un transporte por secuencias pueden tener un contrato con, como mucho, un parámetro de entrada o de salida. Ese parámetro corresponde al cuerpo completo del mensaje y ha de ser un Message, un tipo derivado de Stream, o una implementación IXmlSerializable. Tener un valor devuelto para una operación equivale a tener un parámetro de salida.

Algunas características de WCF, como la mensajería de confianza, las transacciones y la seguridad del nivel del mensaje SOAP, confían en almacenar en búfer los mensajes para las transmisiones. El uso de estas características puede reducir o eliminar las ventajas de rendimiento ganadas mediante la transmisión por secuencias. Para proteger un transporte por secuencias, utilice la seguridad de nivel de transporte únicamente o utilice la seguridad de nivel de transporte más la seguridad de mensaje de solo autenticación.

Los encabezados SOAP siempre están almacenados en búfer, incluso cuando el modo de transferencia es por secuencias. Los encabezados de un mensaje no deben superar el tamaño de la cuota de transporte MaxBufferSize. Para obtener más información sobre este ajuste, vea Cuotas de transporte.

Diferencias entre las transferencias almacenadas en búfer y las transferencias por secuencias

Si se cambia el modo de transferencia de almacenado en búfer a por secuencias, también se cambia la forma del canal nativo de transportes de canalización con nombre y TCP. Para transferencias almacenadas en búfer, la forma del canal nativo es IDuplexSessionChannel. Para las transferencias por secuencias, los canales nativos son IRequestChannel y IReplyChannel. Al cambiar el modo de transferencia en una aplicación existente que utiliza estos transportes directamente (es decir, no a través de un contrato de servicios), requiere el cambio de la forma del canal esperada para los generadores de canales y agentes de escucha.

Vea también

Tareas

Cómo habilitar la transmisión