2012-11-23 14 views
5

Sto utilizzando i binding WCF con la modalità di trasferimento in streaming, sia per caricare e scaricare il contenuto binario da/per un servizio. Sono riuscito a farlo funzionare. Includerò la configurazione, i contratti, ecc. Per riferimento.Streaming con WCF e MTOM

Ho effettuato alcuni test per confrontare diversi binding e codifiche. Il caricamento dei risultati sembra ok. NetTcp è il più veloce, seguito da BasicHttp-MTOM e poi BasicHttp-Text. Quello che mi sorprende è che, quando si scaricano file di grandi dimensioni, MTOM è molto lento rispetto alla codifica di testo con BasicHttp e codifica binaria con NetTcp.

Mi manca qualcosa? Perché BasicHttp-MTOM funziona in modo più lento rispetto ad altri binding durante il caricamento? Accanto a questo ho implementato il doppio buffering per i download. Anche questo funziona bene con tutti i binding tranne BasicHttp con la codifica MTOM. Perché il doppio buffering non aiuta quando si utilizza MTOM?

Grazie per la lettura, i vostri consigli e idee su questo.

Risultati dei test:

Caricamento di 150 MB di dati binari al servizio. Il client crea un flusso di file da un file di 150 MB e passa al server. Il server legge lo stream in un flusso di memoria. Nessun doppio buffer ancora. I risultati sembrano rapidi poiché non vi è alcuna scrittura di dati nel file system. E i collegamenti si comportano come previsto.

Upload

Download 100 MB di dati binari dal servizio. Il servizio crea un flusso di memoria e passa al client. Il client scrive sul file system. Ecco i risultati con buffer singolo e doppio. Come si può vedere MTOM sembra estremamente lento e non risponde al doppio buffering pure.

Download

configurazione del server (lasciato fuori alcune parti per semplicità):

<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> 

configurazione del client (lasciato fuori alcune parti per semplicità):

<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> 

Contratto di servizio:

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

    [OperationContract] 
    DocumentData DownloadFile(); 
} 

Messaggio Contratto:

[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; } 
} 


Edit: Questo si è rivelato essere un problema con il mio setup ambiente di sviluppo sul posto di lavoro. Quando ho eseguito gli stessi test a casa, i risultati sono stati come previsto.

Download

+0

Bella presa con quel doppio buffer anche se nel link che hai condiviso (quello con Thomas Levesque) si afferma che non v'è alcuna differenza di prestazioni usandolo e anche il 10% più lento in uno dei test (l'uso è diverso ma comunque .. troppa differenza di prestazioni tra singolo/doppio). – sotn

risposta