我有一个ashx处理程序,它在浏览器上显示来自二进制数据的PDF,我使用的是.NET Framework 4.0,IIS 6和Chrome浏览器:
Dim s As System.IO.MemoryStream = HttpContext.Current.Session("tmp_binaryData")
s.Seek(0, System.IO.SeekOrigin.Begin)
With HttpContext.Current.Response
.ClearContent()
.ClearHeaders()
.ContentType = "application/pdf"
.AddHeader("Content-Disposition", "inline; filename='test.pdf'")
.BinaryWrite(s.ToArray)
.Flush()
End With
当从HTTPS访问并且用户尝试保存文件(单击PDF查看器工具栏中的保存按钮)时,文件保存为ashx而不是pdf。如果从HTTP(端口80)访问Web应用程序,则不会发生这种情况。
值得一提的是,如果我将ContentType更改为" attachment / pdf"该文件会自动保存为PDF格式。
我已经使用了所有类型的标题组合但没有成功,禁用了Chrome的PDF查看器,尝试了Adobe Reader,检查了IIS上的文件压缩选项,验证了MIME类型,只是为了列出一些。
作为附加信息,我在另一台服务器上的IIS7上托管的另一个Web应用程序上使用了相同的技术,但问题不存在,因此它与IIS 6配置有关。
2017年1月/ 5月更新
我在生产服务器上通过Response.Redirect("test.pdf")
从文件加载了测试pdf,该文件在Chrome上成功保存。所以,我比较了两种显示方法的标题:
Response.Redirect()方法:
headers="
Accept-Ranges: bytes
Content-Length: 696505
Content-Type: application/pdf
Date: Thu, 05 Jan 2017 18:05:09 GMT
ETag: "33dad7f8baccd11:11a1"
Last-Modified: Wed, 22 Jun 2016 19:19:18 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET"
ASHX处理程序(filestram)方法:
headers="
Cache-Control: private
Content-Disposition: inline; filename='Prueba.pdf'
Content-Type: application/pdf
Date: Thu, 05 Jan 2017 18:09:58 GMT
Server: Microsoft-IIS/6.0
Transfer-Encoding: chunked
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET"
我注意到ASHX方法缺少" Accept-Ranges"和" Content-Lenght"标题,但它引起了我的注意,它有"转移编码:chunked"头。你认为这可能导致这个问题吗?我将尝试在ASHX上复制第一个方法标题。
答案 0 :(得分:0)
好吧,我必须在服务器上物理生成PDF文件,然后使用Response.Redirect()将其发送到客户端的浏览器:
Dim s As System.IO.MemoryStream = HttpContext.Current.Session("tmp_binaryData")
Dim serverPath As String = "~/temp/"
System.IO.File.WriteAllBytes(HttpContext.Current.Server.MapPath(serverPath + HttpContext.Current.Session("tmp_fileName")), s.ToArray())
HttpContext.Current.Response.Redirect((serverPath + HttpContext.Current.Session("tmp_fileName")))
会话结束或过期时,需要删除这些生成的文件,这可以在Global.asax
中完成。
另一个workarround将使用原始方法(将字节写入浏览器),而不是单击保存图标,用户将单击打印按钮,然后保存PDF文件。