Возвращение больших байтовых массивов из WCF - проблема с памятью

Мне нужно вернуть большой байтовый массив с сервера WCF.

Проблема в том, что для того, чтобы вернуть такой массив, мне нужно его создать, и при создании такого массива он автоматически переходит в кучу больших объектов, что означает, что когда служба загружена, у меня возникает реальная проблема в использование памяти и управление.

Я думал об использовании неуправляемой памяти, чтобы избежать использования больших массивов управляемых байтов - но все же - как я могу вернуть такой массив из службы WCF?

Есть ли способ вернуть "поток" байтов из службы WCF, который не включает в себя создание управляемого массива байтов? Я знаю, что сам WCF использует BufferManager - поэтому, если он просто читает мою неуправляемую память и использует свое управление буфером для ее хранения перед отправкой - надеюсь, у меня не возникнет проблем.

1 ответ

Решение

Вы можете использовать потоковый режим WCF. С этой страницы:

  1. Для потоковой передачи данных OperationContract для службы должен удовлетворять двум требованиям:

    а. Параметр, содержащий данные для потоковой передачи, должен быть единственным параметром в методе. Например, если входное сообщение является тем, которое должно быть передано в поток, операция должна иметь ровно один входной параметр. Аналогично, если выходное сообщение должно быть потоковым, операция должна иметь либо один выходной параметр, либо возвращаемое значение.

    б. По крайней мере один из типов параметра и возвращаемого значения должен быть либо Stream, Message, либо IXmlSerializable.

  2. Потоковая передача должна быть включена в привязке. Вы устанавливаете свойство TransferMode, которое может принимать одно из следующих значений:

    а. буферизацией,

    б. Потоковая передача позволяет осуществлять потоковую связь в обоих направлениях.

    с. StreamedRequest, который позволяет только потоковую передачу запроса.

    д. StreamedResponse, который позволяет только потоковую передачу ответа.

На этой странице также есть несколько приличных примеров, в том числе как записать собственный поток (это внизу).

Дополнительные сведения о кодировании, потоковой передаче и сеансах, а также некоторые соображения безопасности при использовании потоковой передачи см. На этой странице MSDN.

Другие вопросы по тегам