Подтвердить что ты не робот

WCF Chunking/Streaming

Я использую 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);

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

4b9b3361

Ответ 1

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

Ответ 2

Вы можете сделать свою услугу сессионной и иметь метод инициализации в контракте с свойством 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

Ответ 3

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