Экспорт SSRS не работает через VPN-портал без клиента: что отличается
Страница отчёта доказывает отрисовку, а не экспорт. Проследите запрос экспорта через портал, сравните заголовки и тело, затем узко ограничьте любое исключение.
Отчёт открывается в браузере, параметры отрисовываются, а кнопка экспорта выдаёт ошибку, пустую загрузку или файл, который таблица отказывается открывать. У такого сочетания есть стандартная форма. Работающая страница отчёта проверила отрисовку и аутентификацию и ничего больше. Экспорт — это отдельный запрос со своим ответом, и через портал без клиента он проходит ещё и через слой перезаписи, который никогда не проектировался для скачивания файлов.
Два пути, одна работающая страница
Отрисовка и экспорт — разные операции, даже когда начинаются с одной кнопки. Сервер отчётов отрисовывает страницу для браузера и готовит экспорт через другое расширение вывода с собственным типом содержимого и собственным поведением при ошибке, как описывает документация по экспорту. Портал, безупречно пропускающий первое, всё равно может испортить второе, потому что второе — это ответ, которого портал не ожидал увидеть. Оба делят сеанс и адрес, и почти ничего больше.
Рассматривайте работающую страницу только как доказательство аутентификации и доступности. Она доказывает, что учётная запись достигает сервера отчётов и что портал передаёт HTML. Она ничего не говорит об ответах с файлами, заголовках расположения содержимого или перенаправлениях, которые заканчиваются скачиванием, а не документом.
В этом вся причина сравнивать путь экспорта отдельно, а не заново проверять уже работающую страницу. Два запроса, делящие сеанс, остаются двумя запросами.
Три условия, определяющие, где ломается экспорт
Три вопроса быстро определяют место сбоя, и каждый ответ указывает на другого владельца.
Во-первых, тот же отчёт, учётная запись и формат правильно экспортируются из внутренней сети? Если да, сервер отчётов и его отрисовщик в порядке, и разница в пути доступа. Во-вторых, несёт ли неудачный ответ тип содержимого файла или HTML-страницу с расширением файла? Это отделяет ошибку отрисовщика от подмены порталом. В-третьих, переписывает ли портал URL запроса или удаляет заголовки из ответа? Переписанный URL может оказаться на совершенно другой конечной точке.
Ответьте на все три до изменения любого параметра, потому что у каждого своё средство. Ошибка отрисовщика принадлежит серверу отчётов, подменённое тело принадлежит порталу, а удалённый заголовок — вопрос политики, а не ошибка.
Запишите ответы. Обращение в поддержку, построенное из этих трёх строк, стоит десяти скриншотов.
Читайте ответ экспорта, а не код состояния
Успешный статус HTTP доказывает лишь то, что что-то ответило на запрос. Проверяйте тело и заголовки вместе, потому что интересный сбой — это успешный ответ с неправильным содержимым.
curl -sS -D export.headers -o export.bin --location "https://portal.example.com/reports/export?format=xlsx"
file export.bin
head -c 300 export.bin
Дамп заголовков показывает тип содержимого и любое расположение содержимого, возвращённое порталом. Команда file определяет, чем тело является на самом деле, а текстовый файл там, где ожидалась таблица, — это классическая подменённая страница входа. Команда head показывает достаточно, чтобы распознать HTML, не выливая весь отчёт в терминал.
Удалите сеансовые cookie и токены, прежде чем делиться любой частью этого. Запись работающего экспорта — полезное доказательство, а запись сеанса, принадлежащего кому-то другому, — это инцидент.
Ограничьте исключение приложением, а не учётной записью
Если портал переписывает или блокирует ответ, соблазнительное исправление — освободить весь сайт или сделать отчёт анонимным. Оба варианта исправляют скачивание и убирают причину существования портала. Узкое исключение называет один путь приложения, один тип содержимого и одно направление, и остаётся проверяемым для того, кто владеет политикой.
Используйте ту версию шлюза, которую вы действительно запускаете, и его документированные настройки приложения. Параметр, который поставщик когда-то описал как оставляющий трафик неизменным, не является общим указанием, а копирование его из старой темы форума — это путь, которым временное исключение становится постоянной архитектурой.
Если исключение нельзя ограничить так узко, экспорт, вероятно, относится к внутреннему пути с другим методом доступа, а не за порталом. Освобождение всего сайта — решение владельца портала, а не обходной путь для одного отчёта.
Принимайте экспорт, а не диалог сохранения
Последняя проверка — сам файл: он открывается, содержит ожидаемые столбцы, и его итоги совпадают с отчётом, который утвердил пользователь.
Появление диалога сохранения не является успехом, и файл, открывающийся с предупреждением о восстановлении, тоже не успех. Сравните число строк и одно известное значение с отчётом на экране, потому что усечённый экспорт проходит любой тест, который смотрит только на размер файла. Затем экспортируйте второй раз, потому что слой кеша, однажды отдавший неправильное тело, при следующей попытке может отдать правильное.
Принимайте рабочий процесс, который был нужен пользователю, и ничего меньше. Загрузка, открывающаяся в неправильном приложении, всё равно остаётся неудачным экспортом.