【问题标题】:Issues delivering PDF files in IIS 7.5在 IIS 7.5 中传送 PDF 文件的问题
【发布时间】:2010-07-22 16:02:51
【问题描述】:

这是一个非常奇怪的问题 - 任何想法/帮助/提示将不胜感激。

我们的网络应用使用以下代码将 PDF 文件流式传输到浏览器

byte [] fileBytes = GetTheFileBytes();
string contentType = "application/pdf";

context.Response.Clear();
context.Response.ClearHeaders();
context.Response.ContentType = contentType;
context.Response.AddHeader("Content-Length", fileBytes.Length.ToString());
context.Response.AddHeader("Content-Type", contentType);

MemoryStream outputStream = new MemoryStream(fileBytes);
outputStream.WriteTo(context.Response.OutputStream);
context.Response.Flush();

这在 IIS 6 和 IIS 7 中看起来很无害并且工作正常:如果用户安装了 PDF 插件(adobe 或 foxit 等),那么 PDF 会显示在他们的浏览器中。

但是,在 IIS 7.5(Windows 7 和 Win 2008 R2)中,Foxit 插件在 IE 中挂起,而 Adob​​e 插件在 IE 和 FF 中挂起。即如果我输入

http://iis70Host/application/getPDF.aspx 一切都很好,但是 http://iis75Host/application/getPDF.aspx 在同一浏览器中挂起。

我正在为完全相同的浏览器提供完全相同的 PDF 文件,并且两个 Web 服务器都在 2.0 框架中运行该应用程序。

当它们崩溃时,我还没有设法从任何一个插件中获得有用的错误消息。

我认为 IIS 7.5 以某种方式损坏了文件(因为客户端浏览器和插件是相同的) - 但我发现很难想象 Web 服务器如何出错(它只是将二进制流式传输到毕竟是客户)。

  • 谁能想到为什么 IIS 7.0 和 7.5 的行为会有所不同?
  • 有谁知道如何从 Adob​​e 或 foxit 插件中获取更多调试信息? (如果我能得到它们崩溃的原因,那么也许它会给我一个关于服务器出了什么问题的线索)。
  • 还有其他诊断问题的技巧吗?

跟进

  • 我已使用 wget 捕获文件,它们完全相同

  • 我使用 fiddler 查看了请求和响应标头,但它们没有明确提及响应标头中的“范围”(或请求标头中的接受范围),这说明了这种可能性是 mwalker 建议的多部分请求问题。

  • 我还是继续安装了 MS 修补程序,但这并没有帮助解决问题(因此 我更确定这不是“多部分问题”)。

所以我想我又回来乞求更多关于可能出了什么问题的想法!

以下是 fiddler 在访问运行 IIS 7.5、7.0 和 6 的主机时记录的请求和响应标头

IIS 7.5

GET /eco/dataFile.aspx?data=147098&record=9754 HTTP/1.1
Host: chrisf
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.7) Gecko/20100713 Firefox/3.6.7
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
Referer: http://chrisf/eco/embeddedMedia.aspx?record=9754&search=true
Cookie: CC=test; 

HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 114340
Content-Type: application/pdf
Server: Microsoft-IIS/7.5
X-AspNet-Version: 2.0.50727
Persistent-Auth: true
X-UA-Compatible: IE=8
Date: Mon, 26 Jul 2010 12:47:46 GMT

IIS 7.0

GET /eco/dataFile.aspx?data=147098&record=9754 HTTP/1.1
Host: chris1
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.1; en-GB; rv:1.9.2.7) Gecko/20100713 Firefox/3.6.7
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
Referer: http://chrisf/eco/Test1.htm
Cookie: CC=test; 

HTTP/1.1 200 OK
Cache-Control: private
Content-Length: 114340
Content-Type: application/pdf
Server: Microsoft-IIS/7.0
X-AspNet-Version: 2.0.50727
X-UA-Compatible: IE=8
Date: Mon, 26 Jul 2010 12:17:15 GMT

IIS 6

GET /mi/dataFile.aspx?data=147098&record=9754 HTTP/1.1
Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, */*
Referer: http://mi-dev/mi/embeddedMedia.aspx?record=9754&search=true
Accept-Language: en-GB
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; InfoPath.3; .NET4.0C; .NET4.0E)
Accept-Encoding: gzip, deflate
Host: mi-dev
Connection: Keep-Alive
Cookie: CC=test; 
Authorization: Negotiate YII...

HTTP/1.1 200 OK
Date: Mon, 26 Jul 2010 10:37:47 GMT
Server: Microsoft-IIS/6.0
MicrosoftOfficeWebServer: 5.0_Pub
X-Powered-By: ASP.NET
WWW-Authenticate: Negotiate oYGg...
X-AspNet-Version: 2.0.50727
Content-Length: 114340
Cache-Control: private
Content-Type: application/pdf

【问题讨论】:

  • 使用命令行下载器从网络服务器获取文件并进行比较。 wget 是我的最爱。可在此处获取:unxutils.sourceforge.net。使用 firebug 查看正在发送的标头并进行比较。答案必须是这两个不同之一。让我们知道您发现了什么。
  • 保存响应流而不是直接在浏览器中查看会发生什么?您是否获得了有效的 PDF 文件?您是否使用过数据包嗅探器(或类似工具)来比较您从两个不同服务器获得的标头和响应?
  • 为什么要设置两次内容类型? context.Response.ContentType = contentType;应该够了。
  • IIS 7.5 响应具有“Persistent-auth: true”标头。 Adobe 插件会不会被搞砸?您是否启用了匿名访问?

标签: iis pdf iis-7.5


【解决方案1】:

好的。一位同事终于想通了。

{这些论坛上的任何人都无法对此提供帮助,因为看起来我对问题的描述有误,并且没有说 PDF 插件在 IFrame 内(一条信息是对找到原因至关重要)。但是还是感谢您的尝试:) }

无论如何,这里的问题实际上似乎是:-

如果 PDF 插件位于 IFrame AND 标头 X-UA-Compatible: IE=8 存在,则插件在 IE 中崩溃。

我们的解决方案只是删除 X-UA-Compatible: IE=8 标头。这个头文件是在不久前作为一个快速修复程序来修复一些 IE 渲染问题的,但是我们已经重新编写了 HTML + CSS,现在它是多余的)。它像这样包含在 web.config 中

协议>

我们在 IIS6 上没有看到这个问题的原因似乎是 IIS 6 不尊重这一点,根本没有发送标头!

我 99% 确定这是问题所在:仍有 1% 的疑问,因为他无法在 Firefox 上重现该问题(这是一个仅 IE 的问题),他发现他可以在 IIS 7 和 7.5 上重现该问题.

但是我坐下来看着他重现了这个错误并修复了它,所以要么a)我的旧机器被诅咒了,要么b)我只是一个白痴,当我开始看到这个错误并感到困惑时。你决定。我没有提到插件在 IFrame 中,因为我错误地认为这是一个不相关的细节。

[我第一次尝试这个错误的机器已经变成了一个构建服务器,所以我不能回到那个地方看看我是否可以在 Firefox 上重现]

借口>

【讨论】:

  • 感谢您编写解决方案。这对我来说仍然是一个有用的线索。
【解决方案2】:

我的预感是你遇到过这种情况:

您无法使用启用了 Adob​​e PDF Reader 插件的 Web 浏览器打开某些 IIS 7.5 托管的 PDF 文档
http://support.microsoft.com/kb/979543

多字节魔咒!

您也许可以在您的代码中手动处理“多字节请求”?我会在应用修补程序之前对此进行调查。

如果您运行 Fiddler,您是否看到来自 Adob​​e(或 Foxit)插件的多字节请求?

看起来可以从这里找到解决方案:

http://dotnetslackers.com/articles/aspnet/Range-Specific-Requests-in-ASP-NET.aspx

【讨论】:

  • 确实,Adobe 处理字节范围请求的方式存在一个错误,并且他们没有遵循标准,导致它与 Windows 2008 R2 中的更新中断。
  • 这听起来很有趣 - 不错。不幸的是,我不在办公室自动取款机,但会在星期一进一步调查。我认为快速比较 IIS7 和 7.5 服务器之间的响应标头应该可以告诉我是否是这个问题。
  • 不幸的是,看起来这个特定问题不是我问题的根本原因 - fiddler 没有显示 PDF 插件正在发送多部分 HTTP 标头。真可惜 - 我以为你已经破解了!
  • 因为没有更好的尝试,我还是安装了修补程序 - 它没有改变任何东西。
  • 中间的提琴手是否有相同的行为?保存原始请求和响应并使用比较工具(WinMerge 或类似工具)查看发生了什么。必须有所不同。
【解决方案3】:

另一个导致从 IIS/7.5 在 IE 中打开 PDF 出现问题的潜在原因是在 Internet Explorer 中禁用了 HTTP/1.1。参考http://chentiangemalc.wordpress.com/2012/02/16/case-of-the-disappearing-pdf/

【讨论】:

    【解决方案4】:

    我遇到了类似的问题,经过多次不同的尝试来解决问题,最终导致服务器在响应内容完全完成之前发送了部分响应内容(您不希望在 PDF 文件中出现这种情况,特别是如果您正在使用Chrome pdf 查看器,我会说除 html/css/js 等以外的任何其他文件)。 因此,只需将其添加到响应中,问题就解决了:

    Response.BufferOutput= true; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-04
      • 2018-02-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      相关资源
      最近更新 更多