2010-01-21 47 views
8

我有服务器使用WriteFile的你下载过该文件的一个5MB的PDF给我下载15兆字节,其中作为的TransmitFile给出正确的文件大小为5Mb ...C#Response.WriteFile VS Response.TransmitFile文件大小问题

是这是由于某种解压缩到服务器上的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(); 
} 
+0

我刚刚有同样的错误。 IIS上的压缩设置不会影响它。 – geofftnz 2011-11-03 01:06:31

回答

7

的TransmitFile - 写指定的文件直接传输到HTTP响应输出流而不缓存在内存中。

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

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

2

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

Response.TransmitFile VS Response.WriteFile:

  • 的TransmitFile:这种方法将文件发送到客户端,没有它装载到服务器上的应用程序存储器。如果下载的文件大小很大,这是使用它的理想方式。

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

参考: - 。TransmitFile VS WriteFile