IIS 10 добавляет неизвестный пароль в PDF-файлы, обслуживаемые через веб-сервис ISAPI - PullRequest
0 голосов
/ 25 марта 2020

У меня есть веб-сервис, написанный на Delphi. Одна из его функций - возвращать сгенерированные документы PDF.

Точно такую ​​же базу кода можно создать как EXE (без IIS) и как DLL ISAPI.

Когда библиотека ISAPI загружается в IIS 10, она автоматически добавляет пароль к содержимому PDF в ответе , когда я перехожу по ссылке в Chrome, я получаю:

Требуется пароль

Этот документ защищен паролем. Пожалуйста, введите пароль.

Я не могу открыть документ, так как не знаю, какой пароль он добавил.

Автономный веб-сервис, который не зависит от IIS работает отлично.

Когда я проверяю ответ с помощью Почтальона, он показывает мне, что ответ службы IIS примерно на 100 КБ больше, чем PDF, который работает нормально. Когда я загружаю ответ и пытаюсь открыть файл IIS PDF в Adobe, меня все равно просят ввести пароль, и документ не открывается.

Есть идеи, как остановить IIS, изменяя содержание моего ответа, когда Content-Type - application / pdf?

1 Ответ

0 голосов
/ 27 марта 2020

Я решил свою проблему!

IIS не выполняет никакой автоматической защиты содержимого PDF-файла (спасибо, Лекс!).

Что происходило, это двоичные данные PDF шел от одного потока к другому через строку. По какой-то причине IIS ASAPI DLL использовала другой набор символов / кодировку / кодовую страницу по умолчанию и изменила некоторые из более непонятных символов.

Этого было достаточно, чтобы изменить пароль, встроенный в PDF, без повреждения файл так mu sh, что Adobe больше не распознает его как PDF.

Мой старый неисправный код (который работал в EXE, но не в ISAPI DLL):

Response.Content := LIdHTTP.Get(LURL, LResponseStream);

Моя работа код:

LResponseStream := TMemoryStream.Create; //don't free yourself, indy will
LIdHTTP.Get(LURL, LResponseStream); //avoid any string encoding to avoid problem with jpg and pdf
Response.ContentType := LIdHTTP.Response.ContentType;   
LResponseStream.Position := 0; //NB if this is not done, then NO content gets returned in ISAPI dll!
Response.ContentStream := LResponseStream;

Я был еще сбит с толку, пока не установил позицию чтения потока обратно в ноль. Без этого EXE работал нормально, но DLL-библиотека ISAPI возвращала ноль Content-Length и никаких данных.

Обратимся к тому, что вам нужно с самого начала создать свой веб-сервис для IIS (что я и делаю , но, как вы можете видеть, это все еще тяжелое движение!)

...