IIS7下载文件长度

时间:2009-09-12 19:09:42

标签: asp.net iis-7 content-length

我已经关注了文件下载代码:

        FileInfo fileInfo = new FileInfo(filePath);

        context.Response.Clear();
        context.Response.ContentType = "application/octet-stream";
        context.Response.AddHeader("Content-Disposition", "attachment; filename=" + System.IO.Path.GetFileName(filePath));
        context.Response.AddHeader("Content-Length", fileInfo.Length.ToString());
        context.Response.WriteFile(filePath);
        context.Response.End();

当我在我的本地IIS6上运行它时工作正常。在我开始下载文件之前,Web浏览器(在IE8,Firefox 3.5.2,Opera 10上测试)显示文件长度。

当我在远程IIS7上运行此代码时,Web浏览器不显示文件长度。文件长度未知。

为什么在IIS7下运行此代码时我没有获得文件长度?

2 个答案:

答案 0 :(得分:3)

使用Fiddler检查实际发送的内容。我的猜测是,由于在IIS7服务器上将缓冲设置为false,您将获得分块编码。

顺便说一句,放弃Response.End调用它是一个非常痛苦的事情,并且是不必要的(就此而言,调用Clear也是如此)。

修改

严格来说,当使用分块编码流式传输内容时(在您的场景中这是可取的),Content-Length头应该不存在(请参阅RFC2616 Section 4.4。)在我看来,IIS7会自行执行此操作。事实上,我有一个Classic-ASP场景,当缓冲区关闭时,COM代码尝试添加Content-Length标头时,IIS7会抛出错误。

这真令人讨厌,因为尽管象牙塔中的委员会想要这样,但这个标题为最终用户提供了非常有用的信息。

答案 1 :(得分:0)

感谢这篇文章....我让它在IE第一行工作。

public void WriteCSV(string strData) {
   //Required for IIs7 WS2008R2 fix
   Response.ClearHeaders();
   Response.Clear();


   Response.Buffer = true; 
   Response.ContentType = "application/csv";
   Response.AddHeader("Content-Disposition", "attachment;filename=report.csv");
   Response.Write(strData);
   Response.Flush();
   Response.End();
}