我正在将PDF流式传输到ASP.NET 2.0中的浏览器。这适用于所有浏览器,通过HTTP和所有浏览器除了 IE通过HTTPS。据我所知,这曾经在所有版本的IE中工作(过去5年左右),但我们的客户最近才开始报告问题。我怀疑默认情况下禁用不保存加密的页面到磁盘安全选项,并且在某些时候默认启用(Internet选项 - >高级 - >安全性)。关闭此选项有助于作为解决方案,但作为长期解决方案不可行。

我收到的错误消息是:

  

Internet Explorer无法从www.sitename.com下载OutputReport.aspx。

     

Internet Explorer无法打开此Internet站点。请求的网站不可用或无法找到。请稍后再试。

用于创建PDF的工具是来自 DataDynamics 的ActiveReports。创建PDF后,下面是发送它的代码:

Response.ClearContent()
Response.ClearHeaders()
Response.AddHeader("cache-control", "max-age=1")
Response.ContentType = "application/pdf"
Response.AddHeader("content-disposition", "attachment; filename=statement.pdf")
Response.AddHeader("content-length", mem_stream.Length.ToString)
Response.BinaryWrite(mem_stream.ToArray())
Response.Flush()
Response.End()  

注意:如果我没有明确指定缓存控制,那么.NET代表我发送no-cache,所以我尝试将cache-control设置为:private或public或maxage =#,但这些似乎都没有工作

这是扭曲:当我运行Fiddler检查响应头时,一切正常。我收到的标题是:

  

HTTP / 1.1 200 OK
  缓存控制:max-age = 1
  日期:2009年7月29日星期三17:57:58 GMT
  内容类型:application / pdf
  服务器:Microsoft-IIS / 6.0
  MicrosoftOfficeWebServer:5.0_Pub
  X-Powered-By:ASP.NET
  X-AspNet-Version:2.0.50727
  内容 - 性格:附件;文件名= statement.pdf结果   内容编码:gzip
  变化:接受编码
  转移编码:chunked

一旦我关闭Fiddler并再次尝试,它就会再次失败。我注意到的另一件事是,当Fiddler运行时,我得到此网站的安全证书警告信息有问题,我必须点击继续浏览此网站(不推荐) 通过。当Fiddler关闭时,我没有遇到此安全警告,它立即失败。

我很好奇Fiddler和浏览器之间发生了什么,以便它在Fiddler运行时运行但在不运行时中断,但更重要的是,是否有人有任何想法如何更改我的代码以便将PDF流式传输到IE没有更改客户端计算机?

更新: Fiddler问题得到了解决,非常感谢EricLaw,所以现在它的行为始终如一(破坏,有或没有Fiddler运行)。

根据Google搜索,似乎有大量关于此问题的报告遍布整个网络,每个报告都有自己特定的响应标头组合,似乎可以解决各个案例的问题。我已经尝试了很多这些建议,包括添加ETag,LastModified日期,删除Vary标头(使用Fiddler)以及Cache-Control和/或Pragma标头的几十种组合。我尝试过“Content-Transfer-Encoding:binary”。以及“application / force-download”对于ContentType。到目前为止,没有任何帮助。有一个少数几个 Microsoft KB 文章,所有这些都表明 Cache-Control:no-cache 是罪魁祸首。还有其他想法吗?

更新:顺便说一句,为了完整起见,Excel和Word输出也会出现同样的问题。

更新:没有取得任何进展。我通过电子邮件发送了.SAZ文件

有帮助吗?

解决方案 2

经过两周的疯狂追逐,我无法找到任何代码更改的组合,这些代码更改将允许这种方法在“不将加密的页面保存到磁盘时传输PDF,Excel或Word文档” '选项已开启。

微软已经表示,这种行为是设计在许多知识库文章和私人电子邮件中。看来,当“不加密页面保存到磁盘”选项打开时,IE表现正常并按照要求执行操作。 这篇文章是迄今为止我发现的最佳资源解释了为什么要启用此设置以及启用它的优点和缺点:

  
    
      

"'不保存加密的页面到磁盘'在处理SSL(HTTPS)连接时起作用。就像Web服务器可以发送有关如何缓存文件的完成信息一样,基本上可以将Internet Explorer设置为在SSL(HTTPS)连接期间不将文件保存到缓存,无论Web服务器是否建议您这样做。

             

启用此功能的好处是什么,安全性是打开此功能的首要原因。页面不存储在Internet临时文件缓存中。

             

缺点是什么?性能低下,因为即使在页面上使用了十几次的1字节gif图像也必须每次都从网络服务器中提取,因此没有任何内容保存到缓存中。更糟糕的是,某些用户操作可能会失败,例如下载的文件将被删除并出现错误或打开PDF文档将无法列举几个场景。“

    
  

我们现在可以找到的最佳解决方案是与我们的客户和用户沟通使用此设置的替代方案:

  
    
      

“在浏览器关闭时使用'Empty Temporary Internet Files文件夹'。每次浏览器关闭时,假设没有锁定来自浏览器的另一个实例或某个外部应用程序的文件,所有文件都将从缓存中清除。

             

在使用'不将加密的页面保存到磁盘'之前,需要考虑很多因素。听起来像是一个很好的安全功能,但是使用此功能的结果可能会导致您的服务台呼叫出现下载失败或性能下降。“

    
  

其他提示

您的缓存控制标头不正确。它应该是 Cache-Control:max-age = 1 ,短划线位于中间。首先尝试修复它,看它是否有所作为。

通常,我会说最可能的罪魁祸首是你的Vary标头,因为这样的标头通常会导致IE中的缓存问题: http://blogs.msdn.com/ieinternals/archive/2009/06/17/9769915.aspx 。您可能想尝试在响应标头中添加 ETAG

Fiddler应该对可缓存性没有影响(除非你已经写过规则),听起来你说它确实如此,这表明可能存在某种时序问题。

>不要将加密的页面保存到默认情况下禁用的磁盘安全选项

此选项 默认情况下仍处于禁用状态(在IE6,7和8中),但IT管理员可以通过组策略启用它,而一些主要公司则会这样做。

顺便提一下,您在运行Fiddler时看到证书错误的原因是您没有选择信任Fiddler根证书;请参阅 http://www.fiddler2.com/fiddler/help/httpsdecryption.asp有关此主题的更多信息。

我想要流式传输的PDF文件存在类似问题。即使使用 Response.ClearHeaders(),我也看到了运行时添加的Pragma和Cache-Control标头。解决方案是清除IIS中的标题(右键单击 - >加载PDF的页面上的属性,然后是“Http标题”选项卡)。

我发现这似乎对我有用:

Dim browser As System.Web.HttpBrowserCapabilities = Request.Browser
If (browser.Browser = "IE") Then
  Response.AppendHeader("cache-control", "private") ' ie only
Else
  Response.AppendHeader("cache-control", "no-cache") ' all others (FF/Chrome tested)
End If

已解决:这是一个IE问题,而不是来自aplication ...... 解决此问题: http://support.microsoft.com/kb/323308 在尝试了很长时间后,它对我来说非常适合。

ATT:Mr.Dark

我们长时间遇到类似的问题 - 我们做的是我们(这是Java EE)。在Web应用程序配置中,我们添加

<mime-mapping>
    <extension>PDF</extension>
    <mime-type>application/octet-stream</mime-type>
</mime-mapping>

这将使您的Web应用程序中的任何pdf被下载而不是尝试呈现的浏览器。

编辑:看起来像是在播放它。在这种情况下,您将在代码中使用mime-type作为application / octet-stream,而不是在config中。所以这里而不是

Response.ContentType = "application/pdf"

你将使用

Response.ContentType = "application/octet-stream"

什么版本的IE?我记得Microsoft已针对此问题发布了 IE6的修补程序。希望有用吗?

我读过你的Cache-control goose chase,但我会分享我的,满足了我的需求,万一它有所帮助。

尝试禁用gzip压缩。

在这里添加它希望有人可能会发现这有用而不是通过链接。

这是我的代码

    byte[] bytes = // get byte array from DB

    Response.Clear();
    Response.ClearContent();
    Response.ClearHeaders();
    Response.Buffer = true;

    // Prevent this page from being cached.
    //  NOTE: we cannot use the CacheControl property, or set the PRAGMA header value due to a flaw re: PDF/SSL/IE
    Response.Expires = -1; 

    Response.ContentType = "application/pdf";
    // Specify the number of bytes to be sent
    Response.AppendHeader("content-length", bytes.Length.ToString());

    Response.BinaryWrite(bytes);    

            // Wrap Up
    Response.Flush();
    Response.Close();
    Response.End();

就像OP一样,我试图让它发挥作用几天,但我最终做到了这一点,所以我想我会分享我的'组合'标题:

            if (System.Web.HttpContext.Current.Request.Browser.Browser == "InternetExplorer"
                && System.Web.HttpContext.Current.Request.Browser.Version == "8.0")
            {
                System.Web.HttpContext.Current.Response.Clear();
                System.Web.HttpContext.Current.Response.ClearContent();
                System.Web.HttpContext.Current.Response.ClearHeaders();
                System.Web.HttpContext.Current.Response.ContentType = "application/octet-stream";

                System.Web.HttpContext.Current.Response.AppendHeader("Pragma", "public");
                System.Web.HttpContext.Current.Response.AppendHeader("Cache-Control", "private, max-age=60");
                System.Web.HttpContext.Current.Response.AppendHeader("Content-Transfer-Encoding", "binary");

                System.Web.HttpContext.Current.Response.AddHeader("content-disposition", "attachment; filename=" + document.Filename);
                System.Web.HttpContext.Current.Response.AddHeader("content-length", document.Data.LongLength.ToString());

                System.Web.HttpContext.Current.Response.BinaryWrite(document.Data);
            }

希望能在某个地方拯救某些人的痛苦!

尝试通过SSL流式传输PDF并将其放在iframe或对象中时,我遇到了类似的问题。我发现我的aspx页面将继续重定向到URL的非安全版本,浏览器会阻止它。

我发现从ASPX页面切换到ASHX处理程序修复了我的重定向问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top