WCF Chunking / Streaming - PullRequest
       11

WCF Chunking / Streaming

12 голосов
/ 27 ноября 2008

Я использую WCF и хочу загрузить большой файл с клиента на сервер. Я исследовал и решил следовать принципу чанкинга, обозначенному на http://msdn.microsoft.com/en-us/library/aa717050.aspx

Однако этот подход (так же, как потоковая передача) ограничивает контракт ограниченным количеством подписей методов:

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

В примере используется довольно удобный пример загрузки файла по фиксированному пути и сохранения его по фиксированному пути на сервере. Поэтому мой вопрос: как передать дополнительные параметры, чтобы указать такие вещи, как имя файла, путь к файлу и т. Д.

например. Я хотел бы что-то вроде:

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

Спасибо заранее, Mark.

Ответы [ 4 ]

13 голосов
/ 18 декабря 2008

В этой статье объясняется, как использовать атрибут MessageHeader для принудительной передачи данных в заголовке и, следовательно, не в качестве параметра. Поэтому вместо передачи потока и других метаданных создайте класс с атрибутом MessageContract и отметьте все метаданные как MessageHeader. Затем пометьте поток как MessageBodyMember (который в статье некорректно называется «MessageBody»). Пусть ваш метод UploadStream принимает один параметр, тип которого принадлежит только что созданному классу MessageContract. Я сделал это успешно, но я не сделал это в тандеме с кусками. Удачи.

3 голосов
/ 27 ноября 2008

Вы можете сделать свой сервис сессионным и иметь метод инициализации в контракте со свойством IsInitiating, установленным в true. Что-то вроде:

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

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

Я никогда не пробовал это с потоковыми сервисами, но это должно в основном заставить WCF обеспечивать, чтобы InitializeUploadService всегда вызывался перед UploadStream.

Дополнительную документацию можно найти здесь: http://msdn.microsoft.com/en-us/library/system.servicemodel.description.operationdescription.isinitiating.aspx

1 голос
/ 15 марта 2011

Я бы посмотрел на MessageContracts и добавил эти значения в качестве заголовков сообщений к вашему объекту. Это должно позволить вам передавать поток и любые значения, связанные с потоком, в качестве заголовков сообщений.

0 голосов
/ 19 октября 2010

Настройка maxItemsInObjectGraph на стороне клиента и на стороне сервера работала для меня.

(Не забудьте клиентскую часть.) http://social.msdn.microsoft.com/Forums/en/wcf/thread/0af69654-2d89-44f3-857a-583b57844ca5

...