2008-11-27 3 views
12

ich WCF bin mit und will eine große Datei vom Client zum Server hochladen. Ich habe untersucht und beschlossen, den Chunking Ansatz bei http://msdn.microsoft.com/en-us/library/aa717050.aspxWCF Chunking/Streaming

jedoch schränkt dieser Ansatz (wie Streaming) skizzierte den zu einem Vertrag des begrenzten Methode signitures:

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

Das Beispiel verwendet das eher praktisch Beispiel für das Hochladen eine Datei aus einem festen Pfad und speichert sie in einem festen Pfad auf dem Server. Daher ist meine Frage, wie kann ich zusätzliche Parameter übergeben Dinge wie Dateinamen angeben, filepath usw.

zB. Ich möchte so etwas wie:

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

Vielen Dank im Voraus, Mark.

Antwort

3

Sie können Ihre Service-Session-ful und haben eine Initialisierungsmethode in dem Vertrag mit der IsInitiating Eigenschaft auf true gesetzt werden. Etwas wie:

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

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

habe ich nie versucht, es mit Streaming-Dienste, aber es sollte grundsätzlich WCF machen erzwingen, dass InitializeUploadService immer vor UploadStream genannt wird.

Weitere Dokumentation finden Sie hier: http://msdn.microsoft.com/en-us/library/system.servicemodel.description.operationdescription.isinitiating.aspx

13

This article erläutert, wie die Message Attribut verwenden, um Dinge zu zwingen, in der Kopfzeile übergeben werden, und deshalb nicht als Parameter zählen. Anstatt einen Stream und andere Metadaten zu übergeben, erstellen Sie daher eine Klasse mit dem Attribut MessageContract, und markieren Sie alle Metadaten als MessageHeader. Markieren Sie dann den Stream als MessageBodyMember (der Artikel ruft "MessageBody" falsch auf). Übernehmen Sie mit Ihrer UploadStream-Methode einen einzelnen Parameter, dessen Typ der von Ihnen gerade erstellten MessageContract-Klasse entspricht. Ich habe das erfolgreich gemacht, aber ich habe es nicht zusammen mit Chunking gemacht. Viel Glück.

1

ich MessageContracts und fügen Sie diese Werte als Nachrichten-Header zu Ihrem Objekt aussehen würde. Dadurch können Sie den Stream und alle Werte, die sich auf den Stream beziehen, als Nachrichtenheader übergeben.