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