Wykorzystanie pamięci ASP.net podczas pobierania

Na stronie ASP.net w moim miejscu pracy za obsługę pobierania plików odpowiada następujący fragment kodu (UWAGA: Response.TransmitFile nie jest tutaj używany, ponieważ zawartość pobierania jest przesyłana strumieniowo z pliku zip):

private void DownloadFile( Stream stream)
{
        int bytesRead;
        int chunkSize = 1048576; //1MB

        byte[] readBuffer = new byte[chunkSize];
        while ((bytesRead = stream.Read(readBuffer, 0, readBuffer.Length)) != 0)
            {
                if(!Response.IsClientConnected)
                    break;
                byte[] chunk = new byte[bytesRead];
                Array.Copy(readBuffer,0,chunk,0,bytesRead);
                Response.BinaryWrite(chunk);
                Response.Flush();
        }
        stream.Close();
}

Nasi użytkownicy często pobierają wielomilionowe pliki, które mogą szybko przejąć pamięć serwera. Przypuszczam, że jest to spowodowane buforowaniem odpowiedzi. Czy to ma sens?

Właśnie przeczytałem o właściwości 'buffer' obiektu Response. Jeśli ustawię to na false, czy uniemożliwi to wywołanie Response.BinaryWrite () z buforowania danych w pamięci? Ogólnie, jaki jest dobry sposób na ograniczenie wykorzystania pamięci w tej sytuacji? Być może powinienem przesyłać strumieniowo z zip do pliku tymczasowego, a następnie wywoływać Response.TransmitFile ()?

EDYCJA: Oprócz możliwych rozwiązań, jestem bardzo zainteresowany wyjaśnieniami problemu użycia pamięci obecnego w powyższym kodzie. Dlaczego miałoby to pochłaniać znacznie więcej niż 1 MB, mimo że Response.Flush jest wywoływany w każdej iteracji pętli? Czy jest to tylko niepotrzebna alokacja sterty, która pojawia się przy każdej iteracji pętli (i nie dostaje GC od razu), czy jest coś innego w pracy?

questionAnswers(1)

yourAnswerToTheQuestion