Ottimizzare il trasferimento dei dati binari in WCF

di Cristian Civera, in Windows Communication Foundation,

I servizi che si possono realizzare con WCF e con qualsiasi tecnologia adempiente allo standard, comunicano con il client mediante SOAP, un linguaggio basato su XML contenente il corpo della richiesta, informazioni sul mittente e destinatario ed eventualmente soap header che contengono dettagli sulla sicurezza, transazioni ecc.

Anche se il formato XML è rappresentato come una struttura composta da nodi, non è detto che questo dev'essere in formato testo così come si è abiutati a vederlo. In WCF per esempio usando netTcpBinding si usufruisce in automatico di una codifica binaria dell'XML che permette una maggior compattezza dello stream di byte effettivo passante sul cavo, ottenendo così maggiori performance. Purtroppo questa tecnica non è interoperabile e soprattutto non utilizzabile per binding che fanno uso di protocolli http che necessitano obbligatoriamente di codifiche testuali del messaggio SOAP. Con messaggi relativamenti piccoli, tutto questo non è un problema, ma nel caso di servizi tipici che scambiano per esempio file, la mole di dati può diventare troppo grande a fronte della conversione in testo dei byte che si devono trasferire. Si prenda ad esempio il seguente servizio:

[ServiceContract(Namespace="http://schemas.aspitalia.com/UploadService")]
public interface IUploadService
{
    [OperationContract]
    void UploadFile(Stream data);
}

Dovendo inglobare l'oggetto Stream, rappresentante uno stream di byte, all'interno del messaggio SOAP è necessario che il motore converta i byte secondo una codifica Base64 che ha il pregio di essere un normale testo, ma ha il difetto di ingrossare con un rapporto di circa 4/3 i byte originali, aumentando così ciò che passa effettivamente sul cavo.

Per evitare ciò la specifica MTOM (Message Transmission Optimization Mechanism) prevede di effettuare la richiesta con un messaggio SOAP testuale, ma di inserire inoltre in coda, il binario di uno o più stream presenti nella richiesta, ottimizzando così il traffico e mantenendo l'interoperabilità.

L'uso è piuttosto semplice e consiste nel cambiare nella configurazione del binding il messageEncoding, sia nel client che nel server:

<services>
    <service name="ASPItalia.com.IUploadService">
        <endpoint address=""
             binding="wsHttpBinding" 
             bindingConfiguration="wsMtomHttpBinding"
             contract="ASPItalia.com.IUploadService">
        </endpoint>
    </service>
</services>
<bindings>
    <wsHttpBinding>
        <binding name="wsMtomHttpBinding" messageEncoding="Mtom" />
    </wsHttpBinding>
</bindings>

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi