Ошибка при получении большого отчета с помощью веб-службы выполнения служб Reporting Services
У меня есть приложение, которое хранит фотографии в базе данных. Отчет SSRS используется для создания отчетов о фотографиях, относящихся к конкретному объекту. Информация, необходимая для создания этого отчета, хранится в отдельной базе данных и очень просто связывает ReportId с несколькими фотографиями. Веб-служба выполнения служб Reporting Services используется для отображения отчета в формате Word и вывода байтового массива, который затем используется приложением.
Проблема в том, что существует очень четкое и повторяемое ограничение размера, за пределами которого отчет не получен приложением. В каждом случае отчет представляется успешно, но ответ никогда не отправляется согласно журналам RS:
rshost!rshost!1bfc!03/14/2018-21:46:48:: e ERROR: HttpPipelineCallback::SendResponse(): failed writing response.
rshost!rshost!1bfc!03/14/2018-21:46:48:: e ERROR: Failed with win32 error 0x0057, pipeline=0x0000027542592740.
httpruntime!ReportServer_0-1!1bfc!03/14/2018-21:46:48:: e ERROR: Failed in
BaseWorkerRequest::SendHttpResponse(bool), exception=System.ArgumentException: Value does not fall within the expected range.
at Microsoft.ReportingServices.HostingInterfaces.IRsHttpPipeline.SendResponse(Void* response, Boolean finalWrite, Boolean closeConn)
at ReportingServicesHttpRuntime.BaseWorkerRequest.SendHttpResponse(Boolean finalFlush)
library!ReportServer_0-1!1bfc!03/14/2018-21:46:48:: e ERROR: Throwing Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerHttpRuntimeInternalException: RsWorkerRequest::FlushResponse., Microsoft.ReportingServices.Diagnostics.Utilities.ReportServerHttpRuntimeInternalException: An internal or system error occurred in the HTTP Runtime object for application domain ReportServer_SSRS_0-1-131655000672564770. ---> System.ArgumentException: Value does not fall within the expected range.
at ReportingServicesHttpRuntime.BaseWorkerRequest.SendHttpResponse(Boolean finalFlush)
at ReportingServicesHttpRuntime.RsWorkerRequest.FlushResponse(Boolean finalFlush)
--- End of inner exception stack trace ---;
rshost!rshost!1bfc!03/14/2018-21:46:48:: e ERROR: HttpPipelineCallback::SendResponse(): failed writing response.
rshost!rshost!1bfc!03/14/2018-21:46:48:: e ERROR: Failed with win32 error 0x10DD, pipeline=0x0000027542592740.
По-видимому, это напрямую связано с некоторым ограничением размера ответа HTTP службы по следующим причинам:
- Сам запрос очень маленький, просто идентификатор отчета, т.е. httpRuntime maxRequestLength не связан, это было проверено.
- Ошибка происходит в течение нескольких минут после запроса, т.е. httpRuntime executeTimeout не связано, это было проверено.
- Я могу надежно и многократно добавить одну фотографию слишком много к отчету, и она не удастся, удалить одну фотографию и она рендерит и отправляет без проблем, добавить одну фотографию, и она не удастся...
- Время рендеринга может быть разным, поэтому оно снова связано с размером, а не с тайм-аутом.
- Журналы выполнения сервера отчетов показывают, что рендеринг успешен каждый раз, независимо от того, отправлен ли отчет или нет.
- Я воспроизвел ошибку, используя приложение, которое обычно вызывает отчет, и отдельное консольное приложение, которое просто генерирует клиент веб-службы и пытается отобразить и получить отчет в виде байтового массива с использованием метода Render2.
- Я воспроизвел эту ошибку, используя SQL Server 2012 и SQL Server 2016, на нескольких разных серверах отчетов, включая локальную настройку сервера отчетов и запуск сервера и запросов на одном компьютере.
- Независимо от сочетания фотографий отчет всегда отображается успешно, но не удается отправить около 238 000 000, т. Е. Не связанных с некоторыми неверными данными.
- Во всех случаях я могу создавать отчеты одинакового или большего размера через портал сервера отчетов без проблем.
Кто-нибудь испытывал подобное поведение при использовании веб-службы RS? Я искал онлайн без какой-либо удачи. Будем весьма благодарны за любые предложения о том, как решить эту проблему.
1 ответ
Microsoft, наконец, определила HttpSendResponseEntityBody как источник ошибки. Функция отправляет данные тела объекта, связанные с ответом HTTP, и согласно MSDN имеет следующий параметр:
EntityChunkCount [in] Число структур в массиве, на которое указывает pEntityChunks. Это количество не может превышать 9999.
У Microsoft нет документации по SSRS, касающейся ограничений размера отчетов. На этом этапе все, что они сделали, - это предположили, что "мы можем использовать другие инструменты для извлечения этих данных" и что "обычно мы предлагаем поместить данные размером менее 100 МБ или количество строк меньше 1 000 000".