【问题标题】:C# Response.WriteFile vs Response.TransmitFile filesize issuesC# Response.WriteFile vs Response.TransmitFile 文件大小问题
【发布时间】:2011-01-07 19:32:54
【问题描述】:

我在服务器上有一个 5Mb 的 pdf,使用 writeFile 下载这个文件给了我 15Mb 的下载量,而传输文件给出了正确的 5Mb 文件大小...

这是由于 writeFile 对服务器上的内存进行了某种解压缩吗?只是想知道是否有人见过同样的事情发生......

(ps是上iis7才注意到的??)

代码正在...

if (File.Exists(filepath))
{
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.ContentType = "application/octet-stream";
    HttpContext.Current.Response.AddHeader("content-disposition","attachment;filename=\""+Path.GetFileName(filepath)+"\"");
    HttpContext.Current.Response.AddHeader("content-length", new FileInfo(filepath).Length.ToString());

    //HttpContext.Current.Response.WriteFile(filepath);
    HttpContext.Current.Response.TransmitFile(filepath);

    HttpContext.Current.Response.Flush();
    HttpContext.Current.Response.Close();
}

【问题讨论】:

  • 我也遇到了同样的错误。 IIS 上的压缩设置不影响它。

标签: c# transmitfile


【解决方案1】:

TransmitFile - 将指定文件直接写入 HTTP 响应输出流,而不将其缓冲在内存中。

WriteFile - 将指定文件直接写入 HTTP 响应输出流。

我会说出现差异是因为传输文件没有缓冲它。写入文件正在使用缓冲(Afiak),基本上在传输之前暂时保存数据,因此它无法猜测准确的文件大小,因为它是以块的形式写入的。

【讨论】:

    【解决方案2】:

    你可以通过下面的定义来理解。

    Response.TransmitFile VS Response.WriteFile:

    • TransmitFile:此方法将文件发送到客户端,而不会将其加载到服务器上的应用程序内存中。如果要下载的文件很大,这是使用它的理想方式。

    • WriteFile:此方法将正在下载的文件加载到服务器的内存中,然后再将其发送到客户端。如果文件很大,您可能会重新启动 ASPNET 工作进程。*

    参考:- TransmitFile VS WriteFile

    【讨论】:

      猜你喜欢
      • 2012-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多