【问题标题】:IIS7 downloading file lengthIIS7下载文件长度
【发布时间】:2009-09-12 19:09:41
【问题描述】:

我有以下文件下载代码:

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

【问题讨论】:

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


    【解决方案1】:

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

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

    编辑

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

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

    【讨论】:

    • 是的,我得到“传输编码:分块”,并且没有返回 Content-Length。有什么方法可以在响应标头中获取 Content-Length 吗?我没有直接访问 IIS7 服务器的权限。
    【解决方案2】:

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

    公共无效WriteCSV(字符串strData){ //IIs7 WS2008R2 修复所需 Response.ClearHeaders(); 响应。清除(); 响应缓冲区=真; Response.ContentType = "应用程序/csv"; Response.AddHeader("Content-Disposition", "attachment;filename=report.csv"); Response.Write(strData); Response.Flush(); 响应。结束(); }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-16
      • 1970-01-01
      • 2015-02-18
      • 1970-01-01
      • 2013-10-31
      • 2021-03-28
      • 1970-01-01
      相关资源
      最近更新 更多