我正在尝试使用存储在MSSQL varbinary(MAX)字段中的PDF回复客户端。响应通过http连接在我的localhost和测试服务器上运行,但不能通过https连接在生产服务器上运行。我只使用一个简单的BinaryWrite(下面的代码)。
byte[] displayFile = DatabaseFiles.getPdfById(id);
Response.ContentType = "application/pdf";
Response.BinaryWrite(displayFile);
这里没什么好看的。只需获取二进制数据,设置内容类型,然后写回客户端。为了以这种方式回复https,是否有任何特殊需要做的事情?
编辑:由于不起作用,我的意思是我在浏览器中收到一个空白文档。 Acrobat无法在浏览器中加载。
编辑我刚注意到此问题仅发生在IE 7中.PDF 3中的PDF正确加载。我们的客户端专门使用IE 7(优于IE 6,我说服他们从...笑)。
编辑:尝试添加标题“content-disposition”以使文件充当附件。浏览器无法在SSL下加载IE错误“Internet Explorer无法从ProductionServer.net下载displayFile.aspx”。 (以下代码)
byte[] displayFile = DatabaseFiles.getPdfById(id);
Response.Clear();
Response.AddHeader("content-disposition", String.Format("attachment;filename={0}", fileName));
Response.ContentType = "application/pdf";
Response.BinaryWrite(displayFile);
编辑:如果在生产服务器上通过http查看文件,浏览器将显示PDF的代码,就像通过NotePad查看一样。 (例如%PDF-1.4%â€6 0 obj<> endobj xref 6 33 ...等)
答案 0 :(得分:8)
我刚刚设法通过替换
解决了这个问题Response.Clear();
与
Response.ClearContent();
Response.ClearHeaders();
所以整个事情看起来像:
byte[] downloadBytes = doc.GetData();
Response.ClearContent();
Response.ClearHeaders();
Response.Buffer = true;
Response.ContentType = "application/pdf";
Response.AddHeader("Content-Length", downloadBytes.Length.ToString());
Response.AddHeader("Content-Disposition", "attachment; filename=myFile.pdf");
Response.BinaryWrite(downloadBytes);
Response.Flush();
Response.End();
答案 1 :(得分:1)
IE 7有mime type "issue" PDF,与convoluted mime type rules相关。您可能想验证客户端是否有该补丁。
由于其他原因(脚本标签,response.flush和keepalive),AFAIK还没有得到可靠的解决,因此也出现了IE 7空白页的零星投诉。幸运的是,听起来每次都会发生这种情况 - 所以你应该能够很快地找到它的底部。
您可以尝试将.pdf与ASP.NET关联,以便通过IE将该网址选为PDF文件。这应该覆盖mime类型问题。
重定向(HTTP Response.Redirect,基于Javascript和链接)似乎有助于解决其他一些问题。
在生产服务器上检查IIS keepalive设置,或者使用Fiddler观看,将向您显示Keepalive是否存在问题。
也许添加内容处置标题会有所帮助......但这绝不是我的头脑。
我的猜测是SSL关系是一个红色的鲱鱼,所以我也会在生产服务器上检查非SSL。
答案 2 :(得分:1)
遇到同样的问题。也只有IE。通过从.aspx页面中删除<%@ OutputCache Location="None" %>
来修复我的问题。这或许可以解释为什么Response.ClearHeaders
调用在上面工作。
答案 3 :(得分:0)
几年前我遇到了同样的问题。我们找到的解决方案并不是最美丽的解决方案。我们将文件写入磁盘并对其执行了Response.Redirect。
答案 4 :(得分:0)
你可以使用Wireshark(或类似的)来查看客户端的内容吗?
答案 5 :(得分:0)
以下是Fiddler中查看的原始请求
GET /displayFile.aspx?id=128 HTTP/1.1
Accept: */*
Accept-Language: en-us
UA-CPU: x86
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.5.21022; .NET CLR 3.5.30729; .NET CLR 3.0.30618)
Host: ProductionServer.net
Connection: Keep-Alive
编辑:以下是Fiddler中查看的原始响应标头
HTTP/1.1 200 OK
Date: Wed, 10 Dec 2008 18:39:54 GMT
Server: Microsoft-IIS/6.0
X-Powered-By: ASP.NET
X-AspNet-Version: 2.0.50727
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Content-Type: application/pdf; charset=utf-8
Content-Length: 102076