2014-10-04 3 views
0

В настоящее время наши службы WCF обрабатывают некоторый тип поискового вызова, когда операция возвращает коллекцию объектов. Однако мы обнаружили, что некоторые операции могут в некоторых сценариях возвращать коллекцию не столь тривиальных объектов, которые в конечном итоге производят ответы, превосходящие порог 64 КБ, что вся документация по лучшим методикам побуждает нас пытаться поддерживать оптимизацию основного канала tcp, на котором все работает ,WCF для поисковых запросов большой полезной нагрузки

Например, наш сервис может возвращать список фильмов, отображаемых в театре, и клиент может задавать ежедневные цены, времяпрепровождения и доступность для каждого фильма в течение определенного периода времени; то есть «дайте мне список показываемых фильмов и ежедневную информацию в течение следующих 30 дней». Проблема заключается в том, что мы не можем просто ограничить количество дней, в течение которых клиент может запросить .. так что даже если мы ограничим количество фильмов, возвращенных в один звонок, клиент, запрашивающий информацию за 30 дней, произведет большой ответ чтобы мы избегали как можно большего.

Потоковое связывание невозможно, так как все наши сервисы являются 1 способом с некоторым типом очереди в качестве канала. . Какую конструкцию контракта мы можем изучить для управления размером этих результатов? Конечно, мы также хотим избежать сложных контрактов, которые имеют возможность составлять страницы каждого аспекта ответа, поскольку это никому не приносит пользу.

+0

Интересно, есть ли у вас проблема с дизайном. Зачем возвращать ежедневную информацию в течение следующих 30 дней для фильмов по одному и тому же запросу? Не было бы лучше получить список фильмов, а затем только тогда, когда пользователь что-то выберет, вы получите ежедневную информацию. Таким образом, вы не получаете данные, которые не могут использоваться пользователем – MickyD

+0

@ User52784246, клиент имеет возможность включать или исключать ежедневную информацию из ответа, но некоторые из наших приложений должны включать его для уменьшения количества поездок в сервер в одном действии пользовательского интерфейса. Для этих приложений это техническая необходимость. –

+0

Сокращение «количества поездок» - хорошая стратегия для ** небольших ** объемов данных, но для больших ответов данных, например, в вашем случае _overhead из нескольких trip_ vs _time_, чтобы получить один большой ответ, первый быть довольно незначительным – MickyD

ответ

1

Вне определенного момента вы должны сделать выбор. Вы не можете одновременно отправить тяжелую кучу данных и оставаться ниже 64к ...

Есть, вероятно, другие варианты и подходы, но вот несколько примеров:

  • Добавление опции подкачки в самом запросе и объясните пользователю, что он должен его использовать.

  • Настройте поисковый запрос в случае необходимости (даже если это не требуется в вопросе пользователя) и укажите его пользователю (количество возвращенных элементов/количество оставшихся элементов). Чтобы упростить использование, вы можете сделать своеобразное обслуживание с сохранением состояния с конкретным токеном, присутствующим в ответе, который дает пользователю возможность запросить непосредственно следующий набор результатов. Таким образом, ему не нужно явно указывать размер страницы/пропустить, он получает что-то более жидкое, просто спрашивая: «Теперь пришлите мне следующий результирующий набор, соответствующий этому знаку».

  • Найти способ упростить контракта: удаление ненужных полей, курьерские вещи сжато ...

  • двоичных данных компресс, если не

  • Изменение привязки (вы посмотрите, как они уже думали об этом)

+0

Спасибо за советы @ Рихард. Я могу найти известные API-интерфейсы, использующие оповещение по токенам, но я бы оценил ссылки на реализацию или что-либо, обсуждающее шаблон. –

+0

Подсказка: найдите «токен продолжения», «пропустить токен» или «оповещение на сервере». Вот пример Microsoft, это для OData, но он может помочь вам в реализации: http://blogs.msdn.com/b/odatateam/archive/2010/02/02/server-paging-in-data -сервисы.aspx. Возможно, есть и более «конечные» источники, доступные для реализации в мыльных привязках. – AFract

+0

Вы также можете посмотреть http://stackoverflow.com/questions/8503562/paging-with-wcf-data-service – AFract

0

Какой вид дизайна контракта мы можем заглянуть управлять размером этих типов результатов?

Вместо запроса количество дней (в течение следующих 30 дней) это более целесообразно запросить конкретный период (между «4 октября '14» и «14 октября '14») и проверки если длина этого конкретного периода короче некоторого предела (например, 30 дней). Ограничение длины периода выбирается на основе порога передачи 64k или другого технического фактора.

Как правило, нет проблем с перерывом длительного периода на более мелкие периоды (при необходимости), выполнять 2-3 запроса от клиентского приложения и конкатенатировать результаты.

Смежные вопросы