Chunking / Streaming WCF
Je suis en utilisant WCF et souhaitez télécharger un gros fichier du client vers le serveur. J'ai étudié et a décidé de suivre le chunking approche décrite à http://msdn.microsoft.com/en-us/library/aa717050.aspx
Cependant, cette approche (tout comme le streaming) restreint le contrat limité de la méthode signitures:
[OperationContract(IsOneWay=true)]
[ChunkingBehavior(ChunkingAppliesTo.InMessage)]
void UploadStream(Stream stream);
L'exemple utilise l'exemple utile de télécharger un fichier à partir d'un chemin fixe et de l'enregistrer sur un chemin fixe sur le serveur. Donc, ma question est comment puis-je passer des paramètres supplémentaires pour spécifier des choses comme nom de fichier, chemin d'accès, etc.
par exemple. Je voudrais quelque chose comme:
[OperationContract(IsOneWay=true)]
[ChunkingBehavior(ChunkingAppliesTo.InMessage)]
void UploadStream(Stream stream, String filePath);
Merci d'avance,
Marque.
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
Cet article explique comment utiliser le MessageHeader attribut de forcer les choses à être transmis dans l'en-tête, et donc de ne pas compter comme un paramètre. Donc, au lieu de passer un ruisseau et d'autres méta-données, créez une classe qui a l'attribut MessageContract et marque toutes les méta-données comme un MessageHeader. Marquez ensuite le flux en tant que MessageBodyMember (dont l'article incorrect appelle "MessageBody"). Votre UploadStream méthode de prendre un seul paramètre dont le type est celui de la MessageContract classe que vous venez de créer. J'ai fait cela avec succès, mais je ne l'ai pas fait en tandem avec chunking. Bonne chance.
Vous pourriez faire de votre session de service-ful et ont une méthode d'initialisation dans le contrat avec le IsInitiating propriété est définie sur true. Quelque chose comme:
Je ne l'ai jamais essayé avec les services de streaming mais il devrait faire WCF faire valoir ce que de InitializeUploadService est toujours appelée avant UploadStream.
Plus de documentation peut être trouvée ici:
http://msdn.microsoft.com/en-us/library/system.servicemodel.description.operationdescription.isinitiating.aspx
Je regarde MessageContracts et ajouter ces valeurs en tant qu'en-têtes de message de votre objet. Cela devrait vous permettre de passer le ruisseau et toutes les valeurs liées à la rivière comme en-têtes de message.
De la configuration de l'maxItemsInObjectGraph dans le côté Client et côté Serveur a fonctionné pour moi.
(Ne pas oublier le côté client.) http://social.msdn.microsoft.com/Forums/en/wcf/thread/0af69654-2d89-44f3-857a-583b57844ca5