【问题标题】:C# BinaryWrite over SSLC# BinaryWrite over SSL
【发布时间】:2010-09-26 06:33:23
【问题描述】:

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

【问题讨论】:

  • 定义“不起作用”。例外?输出不正确?
  • 检查有问题的编辑以获得答案。

标签: c# .net file binary


【解决方案1】:

我只是设法通过替换来解决这个问题

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();

【讨论】:

  • 谢谢。这对我也有用,结果你必须使用 Response.BinaryWrite。其他的(Transmitfile、outputstream.write、writefile)不起作用。
  • 其实这个答案的关键是 Content-Length 标头。在我添加标题以明确说明内容大小之前,我遇到了带有 docx 的 BinaryWrite 问题。
  • 这最初不起作用,但在复制您的设置后它起作用了。我认为我的关键是 Response.AddHeader("Content-Length",...
【解决方案2】:

IE 7 有/有一个带有 PDF 的mime type "issue",与convoluted mime type rules 相关。您可能想验证客户端是否有该补丁。

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

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

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

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

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

也许添加一个 content-disposition 标头会有所帮助...不过,这不是我的想法。

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 我在 Wireshark 中寻找什么数据?我看到了 TLSv1 协议下的第一个请求。我有工具,但真的不知道如何理解结果。谢谢。
      • Fiddler 可能更适合这种事情。
      • 刚刚发布了 Fiddler 的原始请求
      【解决方案5】:

      这是在 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
      

      【讨论】:

      • 顺便说一句,你应该把这篇文章移到你的问题中
      【解决方案6】:

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

      【讨论】:

        猜你喜欢
        • 2018-11-23
        • 2010-11-24
        • 1970-01-01
        • 2011-11-30
        • 2013-12-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-07
        相关资源
        最近更新 更多