在 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”作为文件名。这是正常的后果吗?
提前感谢您的帮助。