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.
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.
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.
OriginalL'auteur Yiğit Yener | 2012-11-23
Vous devez vous connecter pour publier un commentaire.
Je vais ajouter des liens que j'ai utilisé pour mettre en œuvre streaming et accepter cela comme une réponse.
Indication avancement pendant le chargement/Téléchargement de Fichiers à l'aide de la WCF Par Dimitris Papadimitriou
La mise en œuvre de la double mise en mémoire tampon lors de la lecture/écriture dans un flux. (Voir Thomas Levesque réponse)
Une autre mise en œuvre de la double mise en mémoire tampon, qui fait la même chose. (Voir Nicholas Carey réponse)
De retour de Flux de service WCF, à l'aide SqlFileStream
Exemple De Travail De Lien
OriginalL'auteur Yiğit Yener