TransferMode Enumeración
Definición
Importante
Parte de la información hace referencia a la versión preliminar del producto, que puede haberse modificado sustancialmente antes de lanzar la versión definitiva. Microsoft no otorga ninguna garantía, explícita o implícita, con respecto a la información proporcionada aquí.
Indica si un canal utiliza modos transmitidos o almacenados en búfer para la transferencia de mensajes de solicitud y de respuesta.
public enum class TransferMode
public enum TransferMode
type TransferMode =
Public Enum TransferMode
- Herencia
Campos
Buffered | 0 | Los mensajes de solicitud y respuesta están almacenados en búfer. |
Streamed | 1 | Se transmiten los mensajes de solicitud y respuesta. |
StreamedRequest | 2 | Se transmite el mensaje de solicitud y se almacena en búfer el mensaje de respuesta. |
StreamedResponse | 3 | Se almacena en búfer el mensaje de solicitud y se transmite el mensaje de respuesta. |
Ejemplos
En el ejemplo siguiente se establece la propiedad TcpTransportBindingElement.TransferMode en Streamed
a través del código:
TcpTransportBindingElement transport = new TcpTransportBindingElement();
transport.TransferMode = TransferMode.Streamed;
BinaryMessageEncodingBindingElement encoder = new BinaryMessageEncodingBindingElement();
CustomBinding binding = new CustomBinding(encoder, transport);
En el ejemplo siguiente se establece la propiedad TcpTransportBindingElement.TransferMode en Streamed
a través de la configuración:
<customBinding>
<binding name="streamingBinding">
<binaryMessageEncoding />
<tcpTransport transferMode="Streamed" />
</binding>
</customBinding>
Comentarios
Windows transporte de Communication Foundation (WCF) admite dos modos de transferencia de mensajes en cada dirección:
Las transferencias almacenadas en búfer contienen el mensaje completo en un búfer de memoria hasta que la transferencia haya finalizado.
Las transferencias transmitidas sólo almacenan en búfer los encabezados de mensaje y exponen el cuerpo del mensaje como una secuencia, de la que se pueden leer partes más pequeñas cada vez.
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 sólo en la dirección indicada.
Las transferencias por secuencias pueden mejorar la escalabilidad de un servicio eliminando la necesidad de grandes búferes de memoria. Que el cambio del modo de transferencia mejore realmente la escalabilidad depende en la práctica del tamaño de los mensajes que se estén transfiriendo. Las mejoras en escalabilidad deberían ser muy evidentes cuando los mensajes grandes utilizan transferencias transmitidas en vez de almacenadas en búfer.
De forma predeterminada, los transportes HTTP, TCP/IP y de canalización con nombre utilizan transferencias de mensajes almacenados en búfer. Puede establecer los valores de TransferMode
en los enlaces proporcionados por el BasicHttpBindingsistema , NetTcpBindingy NetNamedPipeBinding mediante las propiedades del modo de transferencia expuestas en ellos. El modo se puede establecer en la NetTcpBinding clase , por ejemplo, mediante la NetTcpBinding.TransferMode propiedad . También se puede establecer en la sección de configuración para el enlace.
Para los enlaces que no exponen la propiedad de modo de transferencia, el modo de transferencia se puede establecer en el elemento de enlace del transporte y este elemento se puede agregar a continuación a un enlace personalizado. Por ejemplo, cree HttpTransportBindingElement y utilice la propiedad TransferMode para establecer el modo de transferencia al crear un enlace personalizado. El modo de transferencia también se puede establecer en la sección de configuración para el enlace personalizado.
La decisión de utilizar transferencias almacenadas en búfer o transmitidas es una decisión local del extremo para transportes HTTP. Para los transportes HTTP, el modo de transferencia no se propaga a través de una conexión o a los servidores proxy o a otros intermediarios. El establecimiento del modo de transferencia no se refleja en la descripción del contrato de servicio. Después de generar un proxy a un servicio, puede (está permitido pero no es necesario) editar el archivo de configuración de los servicios pensado para ser utilizado con transferencias transmitidas para establecer el modo de transferencia. En los transportes con canalizaciones con nombre y TCP, el modo de transferencia se propaga como una aserción de directiva.
El uso del Streamed
modo de transferencia hace que el entorno de ejecución de WCF aplique algunas restricciones.
Las operaciones que se producen por un transporte transmitido en secuencias pueden tener un contrato con a lo sumo un parámetro de entrada y/o de salida en la capa del modelo de programación. Ese parámetro corresponde al cuerpo completo del mensaje y debe ser un Message, un subtipo de Stream o implementar la interfaz 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 confiable y la seguridad de nivel de mensaje SOAP, se basan en el almacenamiento en búfer de 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 transmitido, utilice sólo la seguridad de nivel de transporte o utilice la seguridad de modo mixto, que combina las notificaciones de WS-Security con la seguridad de transporte.
Los encabezados SOAP siempre están almacenados en búfer, incluso cuando el modo de transferencia está establecido en
Streamed
. Los encabezados para un mensaje no deben superar el tamaño de la cuota de transporte de MaxBufferSize que se expone en los diferentes enlaces y elementos de enlace.
Si se cambia el modo de transferencia de Buffered
a Streamed
, también se cambia la forma del canal nativo de TCP y de transportes de canalización con nombre. 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. Una consecuencia de esto es que los contratos de servicios con sesión no pueden utilizar con transmisión por secuencias del transporte.