使用https在IE6和IE7中出现PDF错误

时间:2009-03-05 13:40:53

标签: asp.net https

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();

好的,这段代码可以使用!

使用HTTPS时不在IE6和IE7中

当使用带有HTTPS的IE6时,它会生成一个另存为对话框(不是在浏览器中打开的pdf) 使用带有HTTPS的IE7时,会导致出现空白屏幕 使用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中的静态文件压缩标志。 我很自信我尝试过它们 所有
  • Adob​​e acrobat reader设置,浏览器设置或任何其他客户端 侧面设置似乎不是 问题。测试不同 机器,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

6 个答案:

答案 0 :(得分:0)

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

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

  1. 将响应的内容类型设置为“application / pdf”,例如。 response.setContentType( “应用/ PDF”);
  2. 在网址末尾添加虚拟参数,如:   http://x.y.z/DoGenCompStmt?filename=dummy.pdf   因为IE忽略内容类型,所以你需要给它一个提示,而“.pdf”扩展是一种简单的方法。
  3. 在响应中设置“content-length”,否则Acrobat Reader插件可能无法正常工作,例如。 response.setContentLength(bos.size());
  4. 似乎有助于某些IE浏览器的另一件事是:response.setHeader(“Content-Disposition”,“inline; filename = somepdf.pdf”);
  5. 编辑:,因为您已经尝试了以上所有内容,我只能指向rfc for content disposition据我所知,这是告诉浏览器如何处理二进制内容的唯一方法

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

经过大量的反复试验后,我找到了一个有效的解决方案,仍然不确定为什么其他代码不起作用。

此代码有效:

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());

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

修复有效,因为IE的问题在于,如果立即加载PDF,它不会在脚本打开的窗口中显示PDF。 (不明原因,但这是问题的核心,也是修复。)

答案 5 :(得分:0)

我注意到您退回的内容类型是

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

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

Response.charset = ""