2010-03-08 4 views
4

Я пытаюсь извлечь большой объем данных из веб-службы WCF. Запрос довольно мал, и ответное сообщение будет очень большим. В настоящее время веб-служба бросает исключения SystemOutOfMemory из-за ограничения на IIS6 для памяти, которую он может выделить (~ 1,4 ГБ).Рекомендации по потоковой передаче веб-службы WCF

Я читал в некоторых блогах, что реализация потоковой передачи решит мою проблему.

Можно ли поделиться своим опытом с этой темой? Меня больше всего интересует какой-либо примерный клиентский код &, который может использоваться совместно или любые рекомендации/рекомендации. MemoryStream vs FileStream? Тип возврата должен быть Stream, Message, Byte []?

Моя работа выглядит следующим образом: (как правило, он будет возвращать большое количество элементов в массиве отклика, ~ 200K элементов)

MediumSizeResponseClass[] GetData(SmallSizeRequestClass request) 

ответ

4

Если вы хотите, чтобы поток обратно только ответ, а затем использовать transferMode=streamedResponse в вашей конфигурации привязки. Это гарантирует, что будет передан только возвращенный ответ.

Возвращаемое значение функции потоковой передачи должно быть Stream. Затем вы можете читать из этого потока и делать все, что вам нужно с ним (хранить, анализировать, что угодно).

Так в основном вы бы контракт на обслуживание что-то вроде этого:

[ServiceContract] 
interface IYourService 
{ 
    [OperationContract] 
    Stream GetData(SmallSizeRequestClass request); 
} 

На сервере, вы в основном просто написать в поток, в то время как на клиенте, вы читаете из потока.

Проконсультировались ли вы с документами MSDN по адресу WCF Streaming?

+0

Также см. Http://msdn.microsoft.com/en-us/library/ms789010.aspx для примеров, которые можно найти в нижней части страницы, связанной с указанным выше. – Xiaofu

+0

Thansk Mark, я как-то знаком с основами внедрения потоковой передачи. Я знаю, что есть разные способы его внедрения, некоторые разработчики будут использовать Message как возвращаемый тип, а не класс Stream. Некоторые будут использовать FileStream, а другие - MemoryStream. Я пытаюсь собрать отзывы, минусы профи в различных реализациях для потоковой передачи в WCF. – Damian

+0

@Damian: хорошо, отлично. Ну, у меня не было особого опыта работы с потоковой передачей в WCF, но я бы сказал: использовать любой поток имеет смысл. Это должен быть поток, поток, поток, но какой тип в значительной степени не имеет значения. Если у вас уже есть файлы на сервере - используйте FileStream. Если вам нужно загрузить blob из таблицы базы данных - используйте MemoryStream. Я не знаю серьезных проблем с использованием одного типа потока по сравнению с другим. Но, возможно, кто-то еще может просветить нас еще! –