4

我正在尝试使用存储在 MSSQL varbinary(MAX) 字段中的 PDF 回复客户。该响应通过 http 连接在我的本地主机和测试服务器上工作,但在通过 https 连接的生产服务器上不起作用。我只使用了一个简单的 BinaryWrite(下面的代码)。

    byte[] displayFile = DatabaseFiles.getPdfById(id);

    Response.ContentType = "application/pdf";
    Response.BinaryWrite(displayFile);

这里没有什么花哨的。只需抓取二进制数据,设置内容类型,然后写回客户端。为了以这种方式通过 https 进行响应,是否需要做任何特别的事情?

编辑:不起作用,我的意思是我在浏览器中得到一个空白文档。Acrobat 无法在浏览器中加载。

编辑:我刚刚注意到这个问题只发生在 IE 7 中。PDF 在 Firefox 3 中正确加载。我们的客户端专门使用 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 的代码,就像通过记事本查看它一样。(例如 %PDF-1.4 %âãÏÓ 6 0 obj <> endobj xref 6 33 ...等)

4

6 回答 6

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();
于 2009-02-18T16:42:15.870 回答
1

IE 7 对 PDF 有一个mime 类型“问题”,与复杂的 mime 类型规则有关。您可能想验证客户端是否有该补丁。

由于其他原因(其中包括脚本标签、response.flush 和 keepalives),还有一些关于 IE 7 空白页的零星投诉,AFAIK 尚未得到可靠解决。

幸运的是,这听起来像每次都在发生——所以你应该能够很快地找到它的底部。

您可以尝试将 .pdf 与 ASP.NET 关联,以便 IE 将 url 作为 PDF 文件拾取。那应该覆盖 mime 类型问题。

重定向(HTTP Response.Redirect、基于 Javascript 和链接)似乎有助于解决其他一些问题。

检查生产服务器上的 IIS keepalive 设置,或使用 Fiddler 观看,将告诉您是否 keepalive 是一个问题。

也许添加一个内容处置标题会有所帮助......不过,这不是我的想法。

我的猜测是 SSL 关系是一个红鲱鱼,所以我也会在生产服务器上检查非 SSL。

于 2008-12-10T17:22:45.417 回答
1

遇到同样的问题。也只能用 IE。<%@ OutputCache Location="None" %>通过从 .aspx 页面中删除来修复我的问题。这也许可以解释为什么Response.ClearHeaders上面的调用有效。

于 2011-02-18T22:50:29.560 回答
0

几年前我遇到了同样的问题。我们找到的解决方案并不是最漂亮的。我们将文件写入磁盘并对其执行 Response.Redirect。

于 2008-12-10T16:01:21.057 回答
0

您可以使用 Wireshark(或类似的)查看客户端的内容吗?

于 2008-12-10T16:13:39.537 回答
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
于 2008-12-10T18:12:45.690 回答