Получить большой список <T>от WCF кусками? - PullRequest
7 голосов
/ 11 апреля 2011

Я пытаюсь получить список сущностей из службы WCF, проблема, с которой я сталкиваюсь, состоит в том, что у нас есть небольшая задержка в сети, и таким образом данные доставляют моему клиенту значительное время.У меня есть идея найти способ получить первые 1000 и просто отправить их в пользовательский интерфейс, пока я жду, пока появятся следующие.

Я думаю, это будет похоже на подкачку, но я просто хочучтобы отобразить полный набор в слое WCF, а не получать по одной странице за раз от db

Cheers

Ответы [ 3 ]

6 голосов
/ 11 апреля 2011

WCF просматривает сообщение целиком, прежде чем передать его на более высокий уровень. Следовательно, ваши данные должны поступать в полном объеме, и обычные контракты WCF работать не будут.

Однако вы можете использовать потоковую передачу с WCF . Это позволяет постепенно считывать полезные данные из потока и передавать их на более высокие уровни. Чтобы это заработало, вам нужно:

  • включить потоковую передачу (по ссылке , которую я предоставил)
  • изменить контракт на обслуживание для предоставления потока
  • на стороне сервера, начать сериализацию объектов и запись в поток, возможно, через 100 частей. Вам нужно самим сериализовать сущности, хотя с помощью DataContractSerializer наша коробка очень проста.
  • Вам необходимо указать разделитель для каждого из этих 100 объектов, чтобы ваш процесс мог определить, где заканчиваются текущие 100. Один из возможных вариантов - 1 КБ нулевого байта.
  • на стороне клиента, реализовать функцию Async. Продолжайте чтение из потока в буферах (например, 4 КБ), пока не достигнете разделителя. Достигнув этого, десериализовать и вызвать асинхронное событие.

Это будет более сложным , чем WCF прямо из коробки, но достигнет того, что вам нужно.

3 голосов
/ 11 апреля 2011

Вы всегда можете разделить свой интерфейс службы на два метода. Например, вместо:

List<T> GetItems()

Вы можете иметь:

int GetItemCount()

List<T> GetItems(int start, int maxSize)

Чтобы вы могли реализовать пейджинг вручную.

0 голосов
/ 12 апреля 2011

В конце концов, поскольку я использую tcpTransport для своего общения, я прекратил использовать дуплексные каналы, чтобы делать то, что мне было нужно.

Я просто изменил свой текущий SearchMethod, который возвращал большой список в void. Внутри этого метода я получаю свои данные из БД, разделяю их на части и отправляю клиенту с помощью операции обратного вызова

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...