我有一个ASP.Net 4.0 web应用程序,它在客户端的浏览器上呈现使用CrystalReports通过二进制写入在iFrame中实时创建的PDF。这个webapp在我的开发工作站(Visual Studio 2012 Web Developer)上运行良好,但是当我测试我们的生产服务器(Win2003,IIS6)时,用户点击一个按钮以流式传输PDF的部分仅显示文档的一部分(仅限页面标志,PDF的其余部分为空白)。我做了一个测试:不是将二进制数据流式传输到客户端浏览器,而是将其保存到服务器虚拟路径上的本地目录,我可以访问完整性正常的PDF,所有数据都出现在保存的文档中。我一直在谷歌搜索3天,尝试所有类型的代码片段,IIS配置(日志文件不显示任何错误),服务器权限,HTML标头,web.config标签等,没有运气。我怀疑它与IIS有什么关系,但我找不到解决方案。这是呈现在客户端浏览器的PDF代码:ASP.NET 4.0,IIS6上的PDF浏览器二进制呈现器
//reportObject is a CrystalReport document object (.rpt)
Dim s As System.IO.MemoryStream = reportObj.ExportToStream(ExportFormatType.PortableDocFormat)
s.Seek(0, SeekOrigin.Begin)
With HttpContext.Current.Response
.ClearContent()
.ClearHeaders()
.ContentType = "application/pdf"
.AddHeader("Content-Disposition", "inline; filename=" & fileName)
.BinaryWrite(s.ToArray)
.Flush()
.End()
End With
我也尝试了这些,所有的工作我的开发机器上,而不是在服务器上:
With HttpContext.Current.Response
.Clear()
.ClearHeaders()
.Buffer = True
.AddHeader("Content-Disposition", "inline; filename=doc.pdf")
.AddHeader("Content-Length", Int32.Parse(s.Length))
.AddHeader("Content-transfer-encoding", "8bit")
.AddHeader("Cache-Control", "private")
.AddHeader("Pragma", "cache")
.AddHeader("Expires", "0")
.AddHeader("X-UA-Compatible", "IE=EmulateIE7")
.ContentType = "application/pdf"
.BinaryWrite(s.ToArray)
.Flush()
.Close()
HttpContext.Current.ApplicationInstance.CompleteRequest()
End With
以及这些行:
.AppendHeader("Accept-Ranges", "none")
.OutputStream.Write(s.ToArray(), 0, Convert.ToInt32(s.Length))
似乎没什么帮助。