繁体   English   中英

IIS 10 正在向通过 ISAPI Web 服务提供的 PDF 添加未知密码

[英]IIS 10 is adding an unknown password to PDFs served via ISAPI web service

我有一个用 Delphi 编写的 Web 服务。 它的功能之一是返回它生成的 PDF 文档。

完全相同的代码库可以构建为 EXE(不需要 IIS)和 ISAPI DLL。

当 ISAPI DLL 加载到 IIS 10 时,它似乎会自动向响应中的 PDF 内容添加密码,当我浏览到 Chrome 中的链接时,我得到:

需要密码

本文档受密码保护。 请输入密码。

我无法打开该文档,因为我不知道它添加了什么密码。

不依赖 IIS 的独立 Web 服务完美运行。

当我使用 Postman 检查响应时,它显示 IIS 服务的响应比正常工作的 PDF 大约 100 KB。 当我下载响应并尝试使用 Adob​​e 打开 IIS PDF 文件时,仍然要求我输入密码,并且文档无法打开。

当 Content-Type 为 application/pdf 时,我有什么想法可以阻止 IIS 更改我的响应内容吗?

我已经解决了我的问题!

IIS 不对 PDF 文件的内容进行任何自动保护(感谢 Lex!)。

发生的事情是 PDF 二进制数据通过字符串从一个流传输到另一个流。 出于某种原因,IIS ASAPI DLL 使用了不同的默认字符集/编码/代码页,并更改了一些更晦涩的字符。

这足以改变嵌入在 PDF 中的密码,而不会损坏文件,以至于 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 工作正常,但 ISAPI DLL 返回 Content-Length 零,并且没有数据。

事实证明,您需要从一开始就为 IIS 构建 Web 服务(我正在这样做,但正如您所见,它仍然很繁重!)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM