Прежде всего, я понимаю, что запускать очень большие / длинные отчеты - ужасная идея. Мне известно, что у Microsoft есть эмпирическое правило, согласно которому отчет SSRS должен выполняться не более 30 секунд. Однако иногда гигантские сообщения являются предпочтительным злом из-за внешних сил, таких как соблюдение законов штата.
У меня по месту работы у нас есть приложение asp.net (2.0), которое мы перенесли из Crystal Reports в SSRS. Из-за большой базы пользователей и сложных требований к пользовательскому интерфейсу создания отчетов у нас есть набор экранов, который принимает введенные пользователем параметры и создает расписания для запуска в течение ночи. Поскольку приложение поддерживает несколько структур отчетности, мы не используем средства планирования / моментального снимка в SSRS. Все отчеты в системе генерируются запланированным консольным приложением, которое принимает введенные пользователем параметры и генерирует отчеты с соответствующими решениями для отчетов, с помощью которых были созданы отчеты. В случае отчетов SSRS консольное приложение генерирует отчеты SSRS и экспортирует их в формате PDF через API веб-службы SSRS.
До сих пор с SSRS было гораздо проще иметь дело, чем с Crystal, за исключением определенного отчета на 25 000 страниц, который мы недавно преобразовали из отчетов Crystal в SSRS. Сервер SSRS - это 64-битный сервер 2003 года с 32 гигабайтами оперативной памяти, работающий под управлением SSRS 2005. Все наши небольшие отчеты работают фантастически, но у нас возникают проблемы с нашими большими отчетами, такими как этот. К сожалению, мы не можем сгенерировать вышеупомянутый отчет через API веб-службы. Следующая ошибка возникает примерно через 30-35 минут после генерации / экспорта:
Сообщение об исключении: базовое соединение было закрыто: при получении произошла непредвиденная ошибка.
Вызов веб-службы - это то, что, я уверен, вы все видели раньше:
data = rs.Render(this.ReportPath, this.ExportFormat, null, deviceInfo,
selectedParameters, null, null, out encoding, out mimeType, out usedParameters,
out warnings, out streamIds);
Странно, что этот отчет будет запускаться / отображаться / экспортироваться, если отчет запускается непосредственно на сервере отчетов с помощью диспетчера отчетов. Процесс, который создает данные для отчета, работает около 5 минут. Отчет отображается в собственном формате SSRS в браузере / средстве просмотра примерно через 12 минут. Экспорт в pdf через браузер / просмотрщик в диспетчере отчетов занимает дополнительно 55 минут. Это работает надежно, и это дает колоссальные 1,03 ГБ PDF.
Вот некоторые из наиболее очевидных вещей, которые я пытался заставить работать отчет через API веб-службы:
- установить HttpRuntime ExecutionTimeout
значение до 3 часов в отчете
Сервер
- отключено сохранение HTTP на сервере отчетов
- увеличено время ожидания скрипта на сервере отчетов
- установить, чтобы отчет никогда не прерывался на сервере
- установить время ожидания отчета на несколько часов при вызове клиента
Из настроек, которые я попробовал, я вполне могу сказать, что любые проблемы с тайм-аутом были устранены.
Исходя из результатов моего исследования сообщения об ошибке, я считаю, что API веб-службы не отправляет фрагментированные ответы по умолчанию. Это означает, что он пытается отправить все 1,3 ГБ по проводам в одном ответе. В определенный момент IIS бросает в полотенце. К сожалению, API абстрагируется от конфигурации веб-службы, поэтому я не могу найти способ включить разбиение ответов.
- Кто-нибудь знает о том, как уменьшить / оптимизировать фазу экспорта PDF и / или размер PDF без уменьшения общего числа страниц?
- Есть ли способ включить ответный чанк для SSRS?
- У кого-нибудь еще есть какие-то теории относительно того, почему это выполняется на сервере, а не через API?
РЕДАКТИРОВАТЬ: После прочтения сообщения kcrumley я начал смотреть на средний размер страницы, принимая размер файла / количество страниц. Интересно, что в небольших отчетах математика получается так, что каждая страница составляет примерно 5 КБ. Интересно, что когда отчет увеличивается, это «среднее» увеличивается. Например, отчет на 8000 страниц в среднем составляет более 40 Кб / страницу. Очень странно. Я также добавлю, что количество записей на странице установлено, за исключением последней страницы в каждой группе, так что это не тот случай, когда на некоторых страницах больше записей, чем на другой.