【问题标题】:PDF wrong error in IE6 and IE7 with https带有https的IE6和IE7中的PDF错误错误
【发布时间】:2009-03-05 13:40:52
【问题描述】:
Response.Write("<script language=\"javascript\">window.open( with https and pdf

我们在 Asp.Net 1.1.4332 应用程序中执行的操作如下:

一个按钮触发一个服务器事件,该事件执行一些处理并将数据放入会话对象中,然后执行以下代码:

string page = Request.ApplicationPath + "/ApkRapportPage.aspx";    
Response.Write("<script language=\"javascript\">window.open('" + page + "','_new');</script>");

这会打开一个页面,将 pdf 流式传输到新的浏览器窗口

基本上使用以下代码(我知道这里缺少一些东西,但这并不真正适合这个问题)

byte[] pdfbytes = Convert.FromBase64String(rapportB64);

Response.ClearContent();
Response.ClearHeaders();
Response.Buffer = true;
Response.ContentType = GetContentType(format);
string header = GetContentDispostionHeader(fileName, format, type);
Response.AddHeader("Content-Disposition", header);
Response.BinaryWrite(pdfbytes);         
Response.End();

好的,这段代码有效!

只是在 IE6 和 IE7 中使用 HTTPS 时不行

当使用带有 HTTPS 的 IE6 时,它会导致一个另存为对话框(不是在浏览器中打开的 pdf) 将 IE7 与 HTTPS 一起使用时,会导致空白屏幕 使用 Firefox 时效果很好

如果我在 page_load 中模拟额外的服务器端处理以将所需数据放入会话中,并将按钮替换为在新窗口中打开相同 pdf 生成页面的链接,则代码有效。

对于实际应用程序,在单击按钮之前获取所需数据不是一个选项。

所以我真的很想让下面的代码工作

string page = Request.ApplicationPath + "/ApkRapportPage.aspx";    
Response.Write("<script language=\"javascript\">window.open('" + page + "','_new');</script>");

问题: 有谁知道为什么在使用 HTTPS 时这段代码在 IE6 和 IE7 中不起作用? 需要什么才能让代码工作?

额外信息:

  • 我尝试不使用 response.write 但 只是一个javascript window.open 后面 按钮,这个效果是一样的
  • 在谷歌上搜索 pdf 流时,你会发现很多人都有 麻烦了,主要是他们设置 标题长度或其他属性或 IIS 中的静态文件压缩标志。 我很有信心我试过了 全部。
  • Adobe acrobat 阅读器设置、浏览器设置或任何其他客户端 侧面设置似乎不是 问题。测试不同 机器,使用 http 工作,使用 https 它没有。
  • 在 https 和 http 之间切换可能与此有关, 但是当我设置 IE 时告诉我我什么时候 正在切换,似乎没有切换 在测试期间发生。
  • 当用 response.redirect 替换 window.open 部分时,代码也可以工作,只是不在新窗口中

任何帮助将不胜感激!


按照 Fiddler 所示的请求头:

   HTTP/1.1 200 OK
   Server: Microsoft-IIS/5.1
   Date: Thu, 05 Mar 2009 14:18:36 GMT
   X-Powered-By: ASP.NET
   X-AspNet-Version: 1.1.4322
   Content-Disposition: Inline;filename=APKrapport.pdf
   Cache-Control: private
   Content-Type: application/pdf; charset=utf-8
   Content-Length: 28307

【问题讨论】:

    标签: asp.net https


    【解决方案1】:

    让附件以您想要的方式打开与您发送的标题有关。如果您定位到想要充当动态 PDF 资源的 .aspx 页面,这些 HTTP 标头将变得越来越重要。

    This website 说明了它可能无法在 IE 中运行的一些原因。

    1. 将响应的内容类型设置为“application/pdf”,例如。 response.setContentType("application/pdf");
    2. 在网址末尾添加一个虚拟参数,例如: http://x.y.z/DoGenCompStmt?filename=dummy.pdf 因为 IE 忽略了 content-types,所以你需要给它一个提示,“.pdf”扩展是一个简单的方法。
    3. 在响应中设置“内容长度”,否则 Acrobat Reader 插件可能无法正常工作,例如。 response.setContentLength(bos.size());
    4. 似乎对某些 IE 浏览器有帮助的另一件事是:response.setHeader("Content-Disposition", "inline;filename=somepdf.pdf");

    编辑:因为您已经尝试了上述所有方法,所以我只能将您指向 rfc for content disposition,据我所知,这是告诉浏览器如何处理二进制内容的唯一方法。

    编辑:真正有用的是在您尝试在浏览器中打开 pdf 时查看它当前返回的 HTTP 标头。 Fiddler does a great job at catching traffic

    【讨论】:

      【解决方案2】:

      您最好使用通用处理程序 (.ASHX) 来提供此类内容,而不是试图强制网页提供 HTML 以外的内容。

      【讨论】:

      • 感谢您的建议。我刚试过这个,它看起来像一个更清洁的解决方案。虽然它并没有解决我的问题。结果是一样的。
      【解决方案3】:

      经过多次反复试验,我找到了一个可行的解决方案,但仍然不确定为什么其他代码不起作用。

      此代码有效:

      StringBuilder js = new StringBuilder("<script language=\"javascript\">");
      js.Append("_window = window.open(\"\",'_new');");
      js.Append("_window.document.open(\"application/pdf\");");
      js.Append("_window.location.href = \"ApkRapportPage.aspx\";");  
      js.Append("_window.document.close();");
      js.Append("</script>");
      
      Response.Write(js.ToString());
      

      必须与 mime 类型有关。

      虽然有问题。当 IE 设置为在您在 HTTP 和 HTTPS 之间切换时显示时,此代码将给出该消息两次。以下代码不会切换,但会导致 ApkRapportPage 的页面加载被触发两次。

      StringBuilder js = new StringBuilder("<script language=\"javascript\">");
      js.Append("_window = window.open(\"ApkRapportPage.aspx\",'_new');");
      js.Append("_window.document.open(\"application/pdf\");");
      js.Append("_window.location.href = \"ApkRapportPage.aspx\";");  
      js.Append("_window.document.close();");
      js.Append("</script>");
      
      Response.Write(js.ToString());
      

      【讨论】:

        【解决方案4】:

        如果您尝试在 IE7 浏览器中查看内嵌 PDF 时出现空白页,并且您使用的是 Acrobat 版本 6。请更新您的 Acrobat 版本以解决问题。

        【讨论】:

          【解决方案5】:

          请注意,此问题与 HTTPS 无关,同样的问题(和相同的修复)适用于 HTTP。

          此修复有效,因为 IE 的问题是,如果一次加载 PDF,它不会在脚本打开的窗口中显示 PDF。 (不知道为什么,但这是问题的核心,也是解决方法。)

          【讨论】:

          • 不,不是。问题中的特定示例适用于 HTTP 而不是 HTTPS。也许在某些情况下,使用 http 你有一个不同的问题可以用同样的方式解决,但最初的问题只发生在 HTTPS 上。
          【解决方案6】:

          我注意到您返回的内容类型已损坏

          "Content-Type: application/pdf; charset=utf-8"

          当您将内容流式传输到 aspx 页面时,请确保您设置了

          Response.charset = ""
          

          【讨论】:

            猜你喜欢
            • 2011-11-26
            • 1970-01-01
            • 1970-01-01
            • 2023-03-14
            • 2015-07-24
            • 1970-01-01
            • 1970-01-01
            • 2012-05-09
            • 1970-01-01
            相关资源
            最近更新 更多