Streaming avec WCF et MTOM

Je suis en utilisant WCF liaisons avec streaming mode de transfert, pour à la fois le téléchargement et le téléchargement de contenu binaire à partir d'un service. J'ai réussi à le faire fonctionner. Je vais inclure la configuration, les contrats, etc pour référence.

J'ai fait quelques tests pour comparer les différentes liaisons et les codages. Téléchargement des résultats semble ok. NetTcp être le plus rapide, suivi par BasicHttp-MTOM et puis BasicHttp-Texte. Quelles surprises moi, c'est que, lors du téléchargement de gros fichiers, MTOM est très lente, par opposition à l'encodage de Texte avec BasicHttp et codage Binaire avec NetTcp.

Suis-je raté quelque chose? Pourquoi BasicHttp-MTOM fonctionne de façon plus lente que les autres liaisons lors du téléchargement? A côté de cela, j'ai mis en place le double buffering pour les téléchargements. Cela fonctionne aussi bien avec toutes les liaisons à l'exception BasicHttp avec MTOM encodage. Pourquoi la double mise en tampon n'aide pas lors de l'utilisation de MTOM?

Merci pour votre lecture, vos conseils et de vos idées à ce sujet.

Résultats Du Test:

Téléchargement de 150 MO de données binaires de service. Client crée un flux de fichier de 150 MO de fichiers et les transmet au serveur. Le serveur lit le flux dans un flux de mémoire. Pas de double tampon encore. Résultats semble vite qu'il n'est pas de l'écriture de données de système de fichiers. Et les liaisons fonctionnent comme prévu.

Streaming avec WCF et MTOM

Téléchargement de 100 MO de données binaires à partir du service. Service crée un flux de mémoire et passe au client. Client écrit de système de fichiers. Voici les résultats à la fois unique et double tampon. Comme vous pouvez le voir
MTOM semble extrêmement lent et ne pas répondre à une double mise en mémoire tampon.

Streaming avec WCF et MTOM

De configuration du serveur (à gauche en sortant de certaines parties pour des raisons de simplicité):

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

De configuration du Client (à gauche en sortant de certaines parties pour des raisons de simplicité):

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

Contrat De Service:

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

    [OperationContract]
    DocumentData DownloadFile();
}

Contrat De Message:

[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: Ceci s'est avéré être un problème avec mon environnement de développement le programme d'installation au travail. Quand j'ai couru les mêmes tests à la maison, le résultat a été comme prévu.

Streaming avec WCF et MTOM

Belle prise avec cette double tampon bien que dans le lien que vous avez partagé(l'une avec Thomas Levesque), il est indiqué qu'il n'y a pas de différence de performances en les utilisant et même 10% plus lent dans l'une des épreuves (l'utilisation est différente, mais toujours.. trop de différence de performances entre simple/double).

OriginalL'auteur Yiğit Yener | 2012-11-23