1

我有以下文件下载代码:

        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 下运行时,为什么我没有得到文件长度?

4

2 回答 2

3

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

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

编辑

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

这真的很烦人,因为不管象牙塔里的委员会想要什么,这个标题给最终用户一个非常有用的信息。

于 2009-09-12T19:21:13.530 回答
0

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

公共无效WriteCSV(字符串strData){
   //IIs7 WS2008R2 修复所需
   Response.ClearHeaders();
   响应。清除();


   响应缓冲区=真;
   Response.ContentType = "应用程序/csv";
   Response.AddHeader("Content-Disposition", "attachment;filename=report.csv");
   Response.Write(strData);
   Response.Flush();
   响应。结束();
}
于 2010-04-30T10:41:18.430 回答