Streaming mit WCF und MTOM

Ich verwende WCF-Bindungen mit gestreamtem Übertragungsmodus sowohl zum Hochladen als auch zum Herunterladen von binären Inhalten zu / von einem Dienst. Ich habe es geschafft, es zum Laufen zu bringen. Ich werde die Konfiguration, Verträge usw. als Referenz hinzufügen.

Ich habe einige Tests durchgeführt, um verschiedene Bindungen und Codierungen zu vergleichen. Das Hochladen der Ergebnisse scheint in Ordnung zu sein. NetTcp ist am schnellsten, gefolgt von BasicHttp-MTOM und BasicHttp-Text. Was mich überrascht, ist, dass MTOM beim Herunterladen großer Dateien im Gegensatz zur Textcodierung mit BasicHttp und der Binärcodierung mit NetTcp sehr langsam ist.

Vermisse ich etwas? Warum arbeitet BasicHttp-MTOM beim Hochladen viel langsamer als andere Bindungen? Außerdem habe ich die doppelte Pufferung für Downloads implementiert. Dies funktioniert auch mit allen Bindungen außer BasicHttp mit MTOM-Codierung. Warum hilft Doppelpufferung bei der Verwendung von MTOM nicht?

Vielen Dank für das Lesen, Ihre Ratschläge und Ideen dazu.

Testergebnisse:

Hochladen von 150 MB Binärdaten zum Dienst. Der Client erstellt einen Dateistream aus einer 150-MB-Datei und leitet ihn an den Server weiter. Server liest den Stream in einen Speicherstream. Noch kein Doppelpuffer. Die Ergebnisse scheinen schnell zu sein, da keine Daten in das Dateisystem geschrieben werden. Und Bindungen funktionieren wie erwartet.

Herunterladen von 100 MB Binärdaten vom Dienst. Der Dienst erstellt einen Speicherstrom und übergibt ihn an den Client. Client schreibt in Dateisystem. Hier sind die Ergebnisse mit einfachem und doppeltem Puffer. Wie Sie sehen, scheint MTOM extrem langsam zu sein und reagiert auch nicht auf doppelte Pufferung.

Serverkonfiguration (einige Teile wurden der Einfachheit halber weggelassen):

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

Client-Konfiguration (einige Teile wurden der Einfachheit halber weggelassen):

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

Servicevertrag:

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

    [OperationContract]
    DocumentData DownloadFile();
}

Nachrichtenvertrag:

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

Bearbeiten: Dies stellte sich als Problem bei der Einrichtung meiner Entwicklungsumgebung bei der Arbeit heraus. Als ich zu Hause dieselben Tests durchführte, war das Ergebnis wie erwartet.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage