在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的答案是肯定的,那么是否有任何优雅的解决方案可以告知客户有关内容长度的信息?
问题3:删除“Content-Length”标题似乎会影响客户端将文件另存为的能力。示例:“Content-Disposition”,使用fileNameSaveAs =“One Two Three.pdf”进行初始化。使用Firefox,在接收文件时,下载对话框默认为“One”作为文件名。这是正常的后果吗?
提前感谢您的帮助。
答案 0 :(得分:1)
做了更多的测试,澄清了一些事情,但在技术上并不令人满意。
A1。 IIS 7.5动态压缩不是原因。无论是动态压缩,静态压缩还是两者都被禁用,仍然会发生下载损坏。在代码中注释掉Response.AddHeader(“Content-Length”...)行。所有下载问题都消失了。
A2。不知道!我真的很想知道。
A3。这种行为可能是一个Firefox错误。这与“Content-Length”标题无关。