Каков наилучший способ передачи большого набора данных через веб-сервис ASMX? - PullRequest
3 голосов
/ 16 июня 2010

Я унаследовал приложение C # .NET, которое взаимодействует с веб-службой, а веб-служба взаимодействует с базой данных Oracle. Мне нужно добавить функцию экспорта в пользовательский интерфейс, чтобы создать электронную таблицу Excel для некоторых данных.

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

Прежде чем я продолжу и придумаю какой-то хитрый способ разделения вызова, мне интересно, есть ли уже что-то, что могло бы справиться с этим. В данный момент я думаю о функции startExport, затем многократно вызываю функцию next50Rows до тех пор, пока не останется никаких данных, но поскольку веб-сервисы не сохраняют состояние, это означает, что мне придется хранить какой-то идентификационный номер и работать связанные разрешения. Это означало бы, что мне не нужно загружать весь набор данных в память веб-сервера, что является одной хорошей вещью.

Поэтому, если кто-нибудь знает лучший способ извлечения большого количества данных (в табличном формате) через веб-сервис ASMX, пожалуйста, дайте мне знать!

Ответы [ 6 ]

6 голосов
/ 16 июня 2010

У нас был такой точный бизнес-сценарий несколько лет назад, и я расскажу вам, что мы сделали.

  1. Попробуйте ограничить объем передаваемых данных
  2. Если вы 'повторно перенесите n таблиц, разделите их на n таблиц данных и перенесите одну таблицу данных за один раз.
  3. Сжатие вашего набора данных / данных перед передачей.Это оказывает огромное (огромное огромное) влияние.С другой стороны, распакуйте поток байтов обратно в набор данных / datatable.Также не используйте встроенное сжатие .NET - используйте SharpZipLib.Это дает гораздо лучшие результаты.
  4. Кроме того, вы можете выполнять передачу асинхронно, чтобы не допустить блокировки клиента.

Наши клиенты годами используют указанное решение без проблем.

2 голосов
/ 16 июня 2010

Я рекомендую WCF Data Services (или как там это называется).Вы можете предоставить конечную точку oData, которая (если у вас есть .NET по обе стороны веб-службы) обеспечивает прозрачное регулирование запросов (сервер ограничивает количество ответов за один вызов, и клиент автоматически делает дополнительные запросы по мере необходимости).Это также дает вам IQueryable стиль интерфейса, который является чрезвычайно гибким.

2 голосов
/ 16 июня 2010

См. " Большие данные и потоковая передача " в библиотеке MSDN.

Не используйте веб-сервисы ASMX, если вы заинтересованы в высокой скорости передачи больших данных.

2 голосов
/ 16 июня 2010

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

Вы также должны вызывать свой веб-сервис в отдельном потоке, чтобы не связывать свой пользовательский интерфейс.

2 голосов
/ 16 июня 2010

Я подозреваю, что вы просто хотите вызывать веб-сервис асинхронно, чтобы ваше приложение не блокировалось на пользовательском интерфейсе, пока все это происходит. Посмотрите на http://msdn.microsoft.com/en-us/library/ms233842.aspx и посмотрите, поможет ли это.

0 голосов
/ 16 июня 2010

Проблема обычная: у вас много данных для возврата пользователю.

Если вам повезет, вы можете уйти, увеличив тайм-аут веб-сервиса. В противном случае, может ли решение о возврате пользователю страницы с данными за раз обратно удовлетворить ваши требования? В этом проекте вызывающий будет отвечать за указание стартовой страницы и количество строк данных на странице для вашего веб-сервиса.

См. Запросы на нумерацию страниц и Советы по разбиению на страницы

Если, тем не менее, вы не ограничены использованием веб-сервиса в качестве решения, то вы можете рассмотреть вопрос о предоставлении служб отчетов своим пользователям. Определенно стоит потратить время на изучение этого альтернативного варианта:)

...