Streaming con WCF y MTOM

Estoy utilizando enlaces WCF con modo de transferencia de flujo, tanto para cargar como para descargar contenido binario desde / hacia un servicio. Me las he arreglado para que funcione. Incluiré la configuración, contratos, etc. para referencia.

He hecho algunas pruebas para comparar diferentes enlaces y codificaciones. Subir los resultados parece estar bien. NetTcp es el más rápido, seguido por BasicHttp-MTOM y luego BasicHttp-Text. Lo que me sorprende es que, al descargar archivos grandes, MTOM es muy lento en comparación con la codificación de texto con BasicHttp y la codificación binaria con NetTcp.

¿Me estoy perdiendo de algo? ¿Por qué BasicHttp-MTOM funciona de forma más lenta que otros enlaces al cargar? Además de eso he implementado doble buffer para descargas. Esto también funciona bien con todos los enlaces, excepto BasicHttp con codificación MTOM. ¿Por qué el doble búfer no ayuda cuando se usa MTOM?

Gracias por leer, sus consejos e ideas sobre esto.

Resultados de la prueba:

Subiendo 150 MB de datos binarios al servicio. El cliente crea una secuencia de archivos a partir de un archivo de 150 MB y pasa al servidor. El servidor lee el flujo en un flujo de memoria. No hay doble buffer todavía. Los resultados parecen rápidos ya que no hay escritura de datos en el sistema de archivos. Y los enlaces se realizan como se espera.

Descargando 100 MB de datos binarios del servicio. El servicio crea una secuencia de memoria y pasa al cliente. El cliente escribe al sistema de archivos. Aquí están los resultados con búfer simple y doble. Como puede ver, el MTOM parece extremadamente lento y tampoco responde al doble búfer.

Configuración del servidor (a la izquierda algunas partes para simplificar):

<configuration>
  <system.web>
    <httpRuntime maxRequestLength="2147483647"/>
  </system.web>
  <system.serviceModel>
    <bindings>
      <netTcpBinding>
        <binding name="StreamedNetTcpBinding"
                 transferMode="Streamed"
                 maxReceivedMessageSize="1099511627776">
        </binding>
      </netTcpBinding>
      <basicHttpBinding>
        <binding name="StreamedBasicHttpBindingWithMtom"
                 messageEncoding="Mtom" transferMode="Streamed"
                 maxReceivedMessageSize="1099511627776">
        </binding>
        <binding name="StreamedBasicHttpBinding"
                 transferMode="Streamed"
                 maxReceivedMessageSize="1099511627776">
        </binding>
      </basicHttpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

Configuración del cliente (omitido algunas partes por simplicidad):

<configuration>
  <system.serviceModel>
    <bindings>
      <basicHttpBinding>
        <binding name="StreamedBasicHttpBindingWithMtom" 
                 maxReceivedMessageSize="1099511627776"
                 messageEncoding="Mtom" transferMode="Streamed">
        </binding>
        <binding name="StreamedBasicHttpBinding"
                 maxReceivedMessageSize="1099511627776"
                 transferMode="Streamed">
        </binding>
      </basicHttpBinding>
      <netTcpBinding>
        <binding name="StreamedNetTcpBinding" transferMode="Streamed"
          maxReceivedMessageSize="1099511627776">
        </binding>
      </netTcpBinding>
    </bindings>
  </system.serviceModel>
</configuration>

Contrato de servicios:

[ServiceContract]
public interface IFileService
{
    [OperationContract]
    void UploadFile(DocumentData document);

    [OperationContract]
    DocumentData DownloadFile();
}

Contrato de mensaje:

[MessageContract]
public class DocumentData
{
    [MessageHeader(MustUnderstand = true)]
    public string DocumentName { get; set; }

    [MessageHeader(MustUnderstand = true)]
    public int FileLength { get; set; }

    [MessageBodyMember(Order = 1)]
    public Stream Data { get; set; }
}

Edición: Esto resultó ser un problema con la configuración de mi entorno de desarrollo en el trabajo. Cuando hice las mismas pruebas en casa, los resultados fueron los esperados.

Respuestas a la pregunta(1)

Su respuesta a la pregunta