2010-01-21 2 views
8

У меня есть 5Mb PDF на сервере dowloading этот файл с помощью WriteFile дает мне 15Mb скачать, где, как TransmitFile дает правильный 5Mb размер файла ...C# Response.WriteFile против Response.TransmitFile размер_файла вопросы

Is это из-за какого-то несжатия в памяти на сервере для writeFile? Просто интересно, если кто-нибудь видел то же самое происходит ...

(пс только заметил это, так как мы пошли в 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

ответ

7

TransmitFile - Записывает указанного файла непосредственно в поток ответа HTTP-ответа без его буферизации в памяти.

WriteFile - Записывает указанный файл непосредственно в поток ответа HTTP-ответа.

Я бы сказал, что разница происходит потому, что файл передачи не буферизует его. Файл записи использует буферизацию (Afiak), в основном временно хранящую данные перед ее передачей, поэтому он не может угадать точный размер файла, потому что он записывает его в куски.

2

Вы можете понять, следуя определению.

Response.TransmitFile VS Response.WriteFile:

  • TransmitFile: Этот метод отправляет файл клиенту без его загрузки в память приложений на сервере. Это идеальный способ использовать его, если размер загружаемого файла большой.

  • WriteFile: этот метод загружает файл, загружаемый в память сервера, перед отправкой его клиенту. Если размер файла большой, то, возможно, рабочий процесс ASPNET может получить перезапущен *

Ссылка: -. TransmitFile VS WriteFile