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

C#Response.WriteFile与Response.TransmitFile文件大小问题,c#,transmitfile,C#,Transmitfile,我在服务器上有一个5Mb的pdf文件,使用writeFile加载这个文件会给我一个15Mb的下载,其中transmitfile提供了正确的5Mb文件大小 这是由于服务器上对writeFile的内存进行了某种解压缩所致吗?只是想知道是否有人见过同样的事情发生 (ps只在我们去iis7后才注意到它??) 代码是 if (File.Exists(filepath)) { HttpContext.Current.Response.Clear(); HttpContext.Current.

我在服务器上有一个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();
}

TransmitFile—将指定的文件直接写入HTTP响应输出流,而不在内存中进行缓冲

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


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

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

Response.TransmitFile与Response.WriteFile:

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

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


参考资料:-

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