2011-08-05 3 views
2

다운로드 할 데이터가 상당히 많습니다. 그러나ASP.NET C#으로 즉시 다운로드를 수행하는 방법?

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

      HttpContext.Current.Response.End(); 

, 그것은에 파일을 기다리고, 서버 메모리의 광대 한 양을 사용하고 있습니다 :

현재 우리의 시스템은 스트림을 (우리가 파일을 사용하지 않는)

코드 출력 다운로드 ... 기다리는 것보다 즉시 다운로드하기 시작합니다. 어떻게해야합니까? 이 설정

+0

이 질문에서 다루는 내용은 다음과 같습니다. http://stackoverflow.com/questions/6781732/unbuffered-output-from-ihttphandler –

답변

2

봅니다 :

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

왜 버퍼링을 해제해야하는지에 대한 설명을 추가 할 수있었습니다 . 버퍼링을 끄면 끝날 때까지 기다리지 않고 출력 버퍼에 쓰는 동안 클라이언트에 데이터가 전송됩니다. –

4

문제는 웹 서버의 메모리에 전체 내용을두고 MemoryStream.ToArray 방법이다.

메모리 스트림을 BinaryWrite과 다르게 전달해야 버퍼링을 통해 이익을 얻을 수 있고 너무 많은 메모리가 필요없이 클라이언트에 데이터를 스트리밍 할 수 있습니다.

4

전체 다운로드를 배열로 변환하는 대신 데이터를 원본 스트림에서 대상 스트림으로 직접 복사해야합니다.

스트림간에 복사하는 좋은 방법은 Best way to copy between two Stream instances - C#을 참조하십시오. 추측 ms에서

은 메모리 스트림이기 때문에 다음과 같은 트릭을 수행해야합니다

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

더 좋은 방법 그러나 오히려 중간 스트림에 비해 출력 스트림에 직접 작성하는 것입니다 이것은 ms에 포함 된 데이터를 얻은 방법에 따라 다릅니다.

관련 문제