2008-11-27 20 views
12

Używam WCF i chcę przesłać duży plik z klienta na serwer. I zbadali i postanowił pójść podejście wyrwy opisaną w http://msdn.microsoft.com/en-us/library/aa717050.aspxWCF Chunking/Streaming

Jednak takie podejście (jak streamingu) ogranicza kontrakt z ograniczoną signitures metoda:

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

Próbka używa raczej wygodny przykład przesyłanie plik ze stałej ścieżki i zapisanie go do stałej ścieżki na serwerze. Dlatego moje pytanie brzmi: jak przekazać dodatkowe parametry, aby określić takie rzeczy jak nazwa pliku, ścieżka pliku itp.

np. Chciałbym coś takiego:

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

góry dzięki, Mark.

Odpowiedz

3

Można wykonać sesję serwisową i mieć metodę inicjowania w umowie z ustawieniem właściwości IsInitiating na wartość true. Coś jak:

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

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

nigdy nie próbowałem go z usług strumieniowych, ale powinien w zasadzie zrobić WCF egzekwować że InitializeUploadService zawsze jest wywoływana przed UploadStream.

Więcej dokumentów można znaleźć tutaj: http://msdn.microsoft.com/en-us/library/system.servicemodel.description.operationdescription.isinitiating.aspx

13

This article wyjaśnia, jak korzystać z MessageHeader atrybut zmusić rzeczy mają być przekazywane w nagłówku, a więc nie liczą się jako parametr. Zamiast więc przekazywać strumień i inne metadane, utwórz klasę, która ma atrybut MessageContract i oznacz wszystkie dane meta jako MessageHeader. Następnie oznacz strumień jako MessageBodyMember (którego niepoprawny artykuł nazywa się "MessageBody"). Niech twoja metoda UploadStream przyjmie pojedynczy parametr, którego typ jest właśnie utworzonej klasy MessageContract. Zrobiłem to z powodzeniem, ale nie zrobiłem tego w parze z chunkingiem. Powodzenia.

1

chciałbym spojrzeć na MessageContracts i dodać te wartości jako nagłówków wiadomości do obiektu. To powinno pozwolić ci przekazać strumień i wszelkie wartości związane ze strumieniem jako nagłówki wiadomości.