2009-03-05 33 views
0
Response.Write("<script language=\"javascript\">window.open(with https and pdf 

我们做一个Asp.Net 1.1.4332应用什么是以下几点:PDF错误错误以https

按钮会触发做了一些处理,并把数据在服务器事件下面的代码执行后会话对象:

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

这将打开流的PDF到新的浏览器窗口

用下面的代码

基本上是一个页面(我知道的东西是缺少^ h但是这并不是真正的问题)

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时

当使用IE6使用HTTPS它导致与HTTPS 当使用IE7一个另存为对话框(在浏览器中打开不是一个PDF格式)它导致一个空白屏幕 当使用Firefox时,它工作得很好

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

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

所以我真的想获得以下代码工作

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

问题: 有谁知道为什么这个代码不会在IE6和IE7工作使用HTTPS时? 需要什么才能使代码正常工作?

额外的信息:

  • 我试着不使用的Response.Write但 只是一个JavaScript window.open后面 按钮,这有相同的效果
  • google搜索PDF流时
  • ,你可以找到很多人遇到这种问题有 ,主要是他们在IIS中设置了 标题长度或其他属性或 静态文件压缩标志。 我很有信心,我尝试了所有 。
  • Adob​​e Acrobat Reader设置,浏览器设置或任何其他客户端 侧面设置似乎不是 问题。测试不同的 机器,用http工程,用https: 它没有。
  • 在https和http之间切换可能与此有关,但是当我设置IE告诉我我在切换时 时,在测试过程中似乎没有发生切换 。
  • 当一个Response.Redirect的替换window.open部分则代码也工作,只是不是在一个新窗口

任何帮助将不胜感激!


按照要求的报头,如图小提琴手:

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 

回答

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

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

This website陈述了它可能无法在IE中工作的一些原因。

  1. 设置响应的内容类型为“application/pdf”,例如。 response.setContentType( “应用/ PDF”);
  2. 添加一个虚拟参数的URL的末尾,如: 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”);

编辑:既然你已经尝试了所有上述我只能指向你的rfc for content disposition这在我的知识是要告诉浏览器如何处理二进制内容的唯一途径。

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

+0

是的,谢谢你的努力。但我尝试了所有这一切。 – KeesDijk 2009-03-05 14:01:48

0

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

+0

感谢您的建议。我只是试过这个,它看起来像一个更清洁的解决方案。但它并没有解决我的问题。结果是一样的。 – KeesDijk 2009-03-05 15:22:40

0

如果你试图查看在IE7浏览器中内嵌PDF时得到一个空白页面,并且您使用Acrobat版本6.更新你的Acrobat版本来解决问题。

0

请注意,这个问题是无关的HTTPS,同样的问题(和相同的修订)适用于HTTP。

的修复工作,因为与IE的问题是,它如果PDF在加载一次不以脚本打开的窗口中显示PDF。 (未知的原因,但是这是问题的核心,该修补程序。)

+0

不,它不是。问题中的特定示例使用HTTP而不使用HTTPS。也许在某些情况下,与HTTP你可以以同样的方式来解决不同的问题,但原来的问题只能用HTTPS发生。 – KeesDijk 2009-12-08 09:19:27

0

我注意到你返回的内容类型的大清洗

“内容类型:应用程序/ PDF格式;字符集= UTF-8 “

当您将内容流传输到aspx页面确保您所设置的

Response.charset = ""