Как выполнить загрузку мгновенно с ASP.NET C #? - PullRequest
2 голосов
/ 05 августа 2011

У нас достаточно большой объем данных для загрузки.

В настоящее время наша система просто выводит поток (мы не используем файлы)

Код:

         HttpContext.Current.Response.AppendHeader("content-disposition", String.Format("attachment; filename={0}", filename));
            HttpContext.Current.Response.BinaryWrite(ms.ToArray());

            HttpContext.Current.Response.End();

Однако он использует большой объем памяти на сервере, ожидая загрузки файла. Я хотел бы сделать так, чтобы он начинал загрузку сразу, а не в ожидании ... Как я могу это сделать?

Ответы [ 3 ]

4 голосов
/ 05 августа 2011

проблема заключается в методе MemoryStream.ToArray, который помещает весь контент в память веб-сервера.

вы должны передавать поток памяти по-другому BinaryWrite, чтобы вы могли получать прибыль от буферизации и потоковой передачи данныхклиенту, не требуя слишком много памяти.

4 голосов
/ 05 августа 2011

Вместо того, чтобы конвертировать всю загрузку в массив, вы должны скопировать данные прямо из исходного потока в целевой поток.

См. Лучший способ копирования между двумя экземплярами потока - C # для хорошего способа копирования между потоками.

Исходя из предположения ms - это поток памяти, и поэтому следующее должно помочь:

CopyStream(ms, HttpContext.Current.Response.OutputStream);

Еще лучше написатьнепосредственно к выходному потоку, а не к промежуточному потоку, однако то, как вы это сделаете, зависит от того, как вы получили данные, содержащиеся в ms.

2 голосов
/ 05 августа 2011

Попробуйте установить это:

HttpContext.Current.Response.BufferOutput = false;
...