1

在 Windows 2008 R2 上的 IIS 7.5 上使用 .NET 4.0。

我想输出代表各种类型文档(图像、PDF、Office 文件等)的二进制内容。假设整个内容已经在 MemoryStream 中,我想通过以下方式输出它:

Response.Clear();
Response.AddHeader("Content-Disposition", string.Format("attachment; filename={0}", fileNameSaveAs));
Response.AddHeader("Content-Length", memoryStr.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.OutputStream.Write(memoryStr.ToArray(), 0, (int) memoryStr.Length);
Response.Flush();

上面的代码不可靠。经常有文件损坏。使用各种浏览器的客户端,有时会中止下载,有时会下载不可读的文件。损坏的可能性随着文件大小的增加而增加。使用 fiddler,我们发现响应头报告的内容长度与原始文件大小不同。因此,为了快速测试,我们注释掉了 Response.AddHeader("Content-Length" ...) 行,损坏问题就消失了。

Q1:这个问题是由动态压缩(IIS7默认启用)引起的吗?

Q2:如果对 Q1 的回答是肯定的,那么有没有什么优雅的解决方案可以通知客户有关 Content-Length 的信息?

Q3:删除“Content-Length”标头似乎会影响客户端将文件另存为的能力。示例:“Content-Disposition”,以 fileNameSaveAs = “一二三.pdf”初始化。使用 Firefox,在接收文件时,下载对话框默认为“One”作为文件名。这是正常的后果吗?

提前感谢您的帮助。

4

1 回答 1

1

做了更多的测试,澄清了一些事情,但在技术上并不令人满意。

A1。IIS 7.5 动态压缩不是原因。无论动态压缩、静态压缩或两者都被禁用,下载损坏仍然发生。一旦 Response.AddHeader("Content-Length" ... 在代码中被注释掉。所有下载问题都消失了。

A2。不知道!我真的很想知道。

A3。此行为可能是 Firefox 错误。这与“Content-Length”标头无关。

于 2011-05-16T19:00:22.990 回答