8 februari 2020 - No Comments!

asp.net 파일 다운로드

FileDownloader.exe는 여러 스레드를 시작할 수 있으며, 그림 2와 같이 지정된 "청크 바이트"로 나눈 파일의 총 크기에 따라 다운로드되는 파일의 별도의 부분(바이트 범위)에 해당하는 별도의 HttpWebRequest 호출을 각각 실행합니다. 앞서 언급한 부분과 필적하는 또 다른 강력한 요소는 서버 메모리에 미치는 영향을 최소화하기 위해 명시적 버퍼링 없이 파일의 바이트를 네트워크 스트림에 직접 작성하기 위해 서버에 HttpResponse.TransmitFile을 사용하는 것입니다. 매우 큰 파일을 다운로드하는 경우에도 서버 메모리에 미치는 영향이 얼마나 무시할 수 있는지 놀랍습니다. 그림 2 다운로드 클라이언트로 독립 실행 형 실행 (실패 한 청크) 그림 1 다운로드Handler.dll에 대 한 처리 흐름의 높은 수준의 디자인 개요 (FileDownloader.exe 를 클라이언트로 사용 하 여) 샘플 프로젝트에 대 한, 다운로드Handler.dll 및 IOThreads.dll을 가상 디렉토리 아래의 bin 디렉토리에 복사하고 web.config의 처리기 섹션 및 모듈 섹션에 항목을 넣는 경우: 이 작업을 수행하는 가장 좋은 방법은 Response.TransmitFile()을 사용하여 ASP.NET 응용 프로그램에서 파일을 명시적으로 전송하고 그런 다음 콘텐츠 유형 및 콘텐츠 처리 헤더를 추가합니다. 최근 버전의 IIS에서는 Response.TransmitFile()이 웹 사이트 또는 가상의 가상 폴더 계층 구조에서만 파일을 제공할 수 있다고 생각했습니다. 가상 경로 외부의 파일의 경우 OutputStream()으로 스트리밍해야 합니다. 본질적으로, 우리는 때때로 느리고 종종 결함이 있는 네트워크 링크가있는 원격 지역에 있는 전 세계 사용자에게 거대한 파일을 다운로드 할 수있는 파일 다운 로더 유틸리티가 필요했습니다. 전 세계의 일부 원격 사용자가 여전히 모뎀 링크 또는 실수로 위성 링크를 사용 하 여 임의의 시간에 또는 간헐적으로 온라인 및 오프라인 사이 전환 될 수 있습니다., 유틸리티는 다운로드 하지 못한 파일의 일부만 다시 시도 하는 기능으로 매우 탄력 적 일 필요가 있을 것 이다. 우리는 사용자가 느린 링크를 통해 거대한 파일을 다운로드 밤새 보내고 싶지 않았고, 네트워크 링크에 작은 딸꾹질이 있다면 전체 다운로드 프로세스를 다시 시작해야합니다.

또한 다운로드되는 이러한 거대한 파일이 서버 메모리에서 버퍼링되지 않고 서버 메모리 사용량이 최소화되도록 해야 했기 때문에 많은 사용자가 동시에 파일을 다운로드할 때 서버 오류가 발생할 때까지 메모리 사용량이 계속 증가하지 않습니다. 이전 예제는 가장 효율적인 TransmitFile()을 사용하지만 항상 작업할 파일이 없는 경우 또는 TransmitFile()이 허용하지 않는 웹 사이트의 디렉터리 구조 외부에 있는 파일이 있을 수 있습니다. 다행히 코드에서 클라이언트에 바이너리 데이터를 보낼 수 있는 다른 방법이 ASP.NET. 그림 1에서 FileDownloader.exe는 URL 쿼리 문자열 매개 변수(file=file.txt)로 다운로드하려는 파일의 이름을 포함하는 간단한 URL을 사용하여 서버를 호출하여 파일 다운로드를 시작하고 내부적으로 HTTP 메서드(HEAD)를 사용하므로 처음에는 서버가 총 파일 크기를 포함하는 응답 헤더만 다시 보냅니다. 그런 다음 클라이언트는 Parallel.ForEach 구문(청크크기=5242880)의 청크 크기를 기준으로 총 파일 크기를 청크(바이트 범위)로 분할합니다. 각 개별 반복에 대해 Parallel.ForEach 구문은 연결된 바이트 범위를 전달하는 별도의 스레드에서 처리 메서드를 실행합니다. 처리 방법 내에서 클라이언트는 동일한 URL을 사용하여 서버에 HttpWebRequest 호출을 발행하고 내부적으로 해당 처리 메서드에 제공된 바이트 범위를 포함하는 HTTP 요청 헤더를 추가합니다(즉, Range: bytes=0-5242880, Range: 바이트=5242880-10485760 등). 파일을 처리하는 경우 할 수 있는 경우 스트림을 피하고 대신 TransmitFile()을 사용하십시오. FileFile은 파일 스트리밍이 파일을 반환하는 동안 IIS 요청 스레드를 해제하도록 I/O 포트에서 발생하는 IIS로 파일 스트리밍을 오프로드하기 때문에 매우 효율적입니다.

Published by: pixol

Comments are closed.