2008-11-27 4 views
12

J'utilise WCF et je veux télécharger un gros fichier du client vers le serveur. Je l'ai étudié et décidé de suivre l'approche CHUNKING décrite à http://msdn.microsoft.com/en-us/library/aa717050.aspxWCF Chunking/Streaming

Cependant, cette approche (tout comme le streaming) limite le contrat signitures méthode limitée:

[OperationContract(IsOneWay=true)] 
[ChunkingBehavior(ChunkingAppliesTo.InMessage)] 
void UploadStream(Stream stream); 

L'exemple utilise l'exemple plutôt pratique d'ajout un fichier à partir d'un chemin fixe et en l'enregistrant dans un chemin fixe sur le serveur. Par conséquent, ma question est comment puis-je passer des paramètres supplémentaires pour spécifier des choses comme le nom de fichier, chemin de fichier, etc

par exemple. Je voudrais quelque chose comme:

[OperationContract(IsOneWay=true)] 
[ChunkingBehavior(ChunkingAppliesTo.InMessage)] 
void UploadStream(Stream stream, String filePath); 

Merci à l'avance, Mark.

Répondre

3

Vous pouvez rendre votre service session-ful et avoir une méthode d'initialisation dans le contrat avec la propriété IsInitiating définie sur true. Quelque chose comme:

[OperationContract(IsInitiating = true)] 
void InitializeUploadService(string filename); 

[OperationContract(IsOneWay = true, IsInitiating = false)] 
[ChunkingBehavior(ChunkingAppliesTo.InMessage)] 
void UploadStream(Stream stream); 

Je ne l'ai jamais essayé avec les services de streaming, mais il devrait essentiellement faire appliquer WCF que InitializeUploadService est toujours appelée avant UploadStream.

Plus de documentation est disponible ici: http://msdn.microsoft.com/en-us/library/system.servicemodel.description.operationdescription.isinitiating.aspx

13

This article explique comment utiliser l'attribut MessageHeader pour forcer les choses à transmettre dans l'en-tête et compte donc pas comme paramètre. Ainsi, au lieu de transmettre un flux et d'autres métadonnées, créez une classe ayant l'attribut MessageContract et marquez toutes les métadonnées en tant que MessageHeader. Ensuite, marquez le flux en tant que MessageBodyMember (que l'article appelle incorrectement "MessageBody"). Demandez à votre méthode UploadStream de prendre un seul paramètre dont le type est celui de la classe MessageContract que vous venez de créer. Je l'ai fait avec succès, mais je ne l'ai pas fait en tandem avec la segmentation. Bonne chance.

1

je regardais MessageContracts et ajouter ces valeurs en-têtes de message à votre objet. Cela devrait vous permettre de transmettre le flux et toutes les valeurs liées au flux en tant qu'en-têtes de message.