我有一台 Windows 2008 R2(虚拟)服务器,运行多个网站。我的客户已通过 FTP 将多个 PDF 上传到下载目录,客户可以通过网页从该目录检索这些 PDF。
在 IE 和 Safari 中,此方法运行良好,但尝试使用 Firefox 或 Chrome 下载时,两种浏览器都会挂起,并且 Firefox 会在页面底部的状态栏中显示“已停止”。我们在不同地点的几台电脑上尝试过此方法,因此我认为这可能是服务器问题 - 虽然可以想象,用于生成 PDF 的软件可能产生了与流式传输到 Firefox/Chrome 不兼容的内容。
为什么会产生这种行为?我需要更改某些配置设置吗?
编辑:使用 Firebug 检查标头 - GET 坚持 206 部分内容
Content-Type application/pdf
Last-Modified Sun, 21 Mar 2010 19:50:49 GMT
Accept-Ranges bytes
Etag "42da4bce2fc9ca1:0"
Server Microsoft-IIS/7.5
X-Powered-By ASP.NET
Date Thu, 27 May 2010 15:39:34 GMT
Content-Length 329532
Content-Range bytes 27484-357015/357016
Request Headersview source
Host www.caepost.co.uk
User-Agent Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
Accept text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language en-gb,en;q=0.5
Accept-Encoding gzip,deflate
Accept-Charset ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive 115
Connection keep-alive
Range bytes=27484-357015,27484-27485
答案1
IIS 7.5 版改变了其响应字节范围请求(例如 Acrobat 插件发出的请求)的方式。如果请求针对单个连续范围,IIS 现在将使用“Content-Range”标头而不是“ContentType: multipart/byteranges”标头进行响应,这实际上是有效的 HTTP,但它会使 Acrobat 插件感到困惑。
Adobe 目前正在努力修复:http://kb2.adobe.com/cps/807/cpsid_80780.html
与此同时,微软提供了一个修补程序,使 IIS 7.5 恢复到以前的行为:http://support.microsoft.com/kb/979543
答案2
我们升级了服务器,但 IIS 7.5 也出现了同样的问题。检查了标头并确认了问题。
应用修补程序http://support.microsoft.com/kb/979543但这并没有解决问题。我认为这里的区别在于我们的网站是在经典模式下运行的。(必须对安装的另一个产品(Imis)执行此操作)。因此,似乎只有当您的网站在集成模式下运行时,此修补程序才有效。
最后我不得不编写一个处理程序来捕获 pdf 文档请求并更改响应标头。
context.Response.ContentType = "application/pdf";
context.Response.TransmitFile(filePath);
context.Response.End();
这招很管用。
症状不仅限于 Acrobat 打开文档。在我们的案例中,无论你使用什么 pdf 阅读器,google chrome 在尝试打开 pdf 时也会挂起。
答案3
答案4
这可能是由于 IIS 7.0 中的压缩设置造成的。
请求标头包含以下内容:
Accept-Encoding: gzip,deflate
表明浏览器接受压缩内容。
使用时:
context.Response.TransmitFile(filePath);
IIS 查看设置的内容类型,并决定是否压缩响应。
不幸的是 IIS 似乎没有添加
Content-Encoding: gzip
到响应头,这意味着 Firefox 和 Chrome 无法确定数据是否被压缩。
在 IIS 中禁用内容压缩应该可以解决这个问题,但会影响整个网站。此外,在某些情况下,设置内容类型的建议可能有效。IIS 7 根据 mime 类型决定是否压缩响应。
http://www.iis.net/configreference/system.webserver/httpcompression给出了在 ApplicationHost.config 文件中配置 httpCompression 的示例:
<httpCompression
directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files">
<scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" />
<dynamicTypes>
<add mimeType="text/*" enabled="true" />
<add mimeType="message/*" enabled="true" />
<add mimeType="application/javascript" enabled="true" />
<add mimeType="*/*" enabled="false" />
</dynamicTypes>
<staticTypes>
<add mimeType="text/*" enabled="true" />
<add mimeType="message/*" enabled="true" />
<add mimeType="application/javascript" enabled="true" />
<add mimeType="*/*" enabled="false" />
</staticTypes>
</httpCompression>
另一个选择是确保“Content-Encoding:gzip”始终添加到响应标头,但您需要小心确保响应确实会被压缩,但对于所有内容类型来说可能并非如此。