C#Response.WriteFile与Response.TransmitFile文件大小问题

时间:2010-01-21 16:01:22

标签: c# transmitfile

我在服务器上有一个5Mb pdf,使用writeFile下载这个文件给我一个15Mb的下载,其中transmitfile提供了正确的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();
}

2 个答案:

答案 0 :(得分:7)

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

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

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

答案 1 :(得分:3)

您可以通过以下定义来理解。

Response.TransmitFile VS Response.WriteFile:

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

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

参考: - TransmitFile VS WriteFile