Создание большого потока в потоковом режиме - PullRequest
1 голос
/ 22 декабря 2011

Мне следует внедрить службу OData, которая сможет генерировать поток в потоковом режиме, т. Е. Клиент должен начать читать первые записи канала, когда служба еще генерирует следующие записи.

Возможно ли такое поведение с помощью служб данных WCF?

Пока я не могу сделать такое поведение - служба сначала генерирует весь фид в буфере, а затем только начинает передавать его клиенту, но такое поведение мне не подходит из-за того, что оно слишком велико для генерации в буфере.не содержит BLOB-свойств, только очень много строк, поэтому реализация IDataServiceMetadataProvider не поможет.

Ответы [ 2 ]

0 голосов
/ 22 декабря 2011

Я смог решить эту проблему, просто разрешив потоковую передачу WCF - указав TransferMode = "Streamed":

<system.serviceModel>
    <serviceHostingEnvironment aspNetCompatibilityEnabled="true"/>
  <services>
    <service name="ODataDemo.OdataDemoDataService">
      <endpoint bindingConfiguration="msgSize" address="" binding="webHttpBinding" contract="System.Data.Services.IRequestHandler" />
    </service>
  </services>
  <bindings>
    <webHttpBinding>       
      <binding name="msgSize" transferMode="Streamed" />
    </webHttpBinding>
  </bindings>
</system.serviceModel>
0 голосов
/ 22 декабря 2011

Я думаю, что это невозможно.Службы WCF (а также службы данных WCF) обеспечивают потоковую передачу, но поддержка потоковой передачи не основана на одновременной записи и чтении на обоих концах обмена данными.Например, потоковая передача работает хорошо, если у вас есть файл на диске, и вы передаете его поток на канал WCF для отправки.

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

Я пытался создать службу, в которой поток будет непрерывно заполняться из другого потока после возврата из операции, но этовообще не работал.

...