C#BinaryWrite over SSL

时间:2008-12-10 15:53:02

标签: c# .net file binary

我正在尝试使用存储在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 ...等)

6 个答案:

答案 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