본질적으로, 우리는 때때로 느리고 종종 결함이 있는 네트워크 링크가있는 원격 지역에 있는 전 세계 사용자에게 거대한 파일을 다운로드 할 수있는 파일 다운 로더 유틸리티가 필요했습니다. 전 세계의 일부 원격 사용자가 여전히 모뎀 링크 또는 실수로 위성 링크를 사용 하 여 임의의 시간에 또는 간헐적으로 온라인 및 오프라인 사이 전환 될 수 있습니다., 유틸리티는 다운로드 하지 못한 파일의 일부만 다시 시도 하는 기능으로 매우 탄력 적 일 필요가 있을 것 이다. 우리는 사용자가 느린 링크를 통해 거대한 파일을 다운로드 밤새 보내고 싶지 않았고, 네트워크 링크에 작은 딸꾹질이 있다면 전체 다운로드 프로세스를 다시 시작해야합니다. 또한 다운로드되는 이러한 거대한 파일이 서버 메모리에서 버퍼링되지 않고 서버 메모리 사용량이 최소화되도록 해야 했기 때문에 많은 사용자가 동시에 파일을 다운로드할 때 서버 오류가 발생할 때까지 메모리 사용량이 계속 증가하지 않습니다. 그림 2 다운로드 클라이언트로 독립 실행 실행 파일 (실패 한 청크) 그림 1에서 FileDownloader.exe 는 URL 쿼리 문자열 매개 변수 (file=file.txt)로 다운로드 하려는 파일의 이름을 포함 하는 간단한 URL을 사용 하 여 서버를 호출 하 여 파일 다운로드를 시작 하 고 내부적으로 HTTP 메서드를 사용 하 여 HTTP 메서드 (HEAD), 그래서 처음에 서버는 응답 헤더의 전체 중 하나만 다시 보낼 것 이다. 그런 다음 클라이언트는 Parallel.ForEach 구문(청크크기=5242880)의 청크 크기를 기준으로 총 파일 크기를 청크(바이트 범위)로 분할합니다. 각 개별 반복에 대해 Parallel.ForEach 구문은 연결된 바이트 범위를 전달하는 별도의 스레드에서 처리 메서드를 실행합니다. 처리 방법 내에서 클라이언트는 동일한 URL을 사용하여 서버에 HttpWebRequest 호출을 발행하고 내부적으로 해당 처리 메서드에 제공된 바이트 범위를 포함하는 HTTP 요청 헤더를 추가합니다(즉, Range: bytes=0-5242880, Range: 바이트=5242880-10485760 등). 이 동작은 브라우저마다 다릅니다.

파이어 폭스는 당신에게 선택을 제공하는이 좋은 대화 상자가 있습니다. Internet Explorer는 파일을 저장할지 여부를 묻는 노란색 하단 표시줄을 표시합니다. 크롬 – 옵션에 따라 – 단순히 아무것도 프롬프트없이 다운로드 폴더에 파일을 다운로드합니다. IHttpAsyncHandler에서 비동기를 구현하기 위해 중첩된 I/O 구조를 I/O 완료 포트에 수동으로 게시하고 CLR ThreadPool은 완료 포트 스레드에서 중첩된 구조에 제공된 완료 대리자를 실행합니다. 이러한 스레드는 대부분의 기본 제공 비동기 메서드에서 사용하는 것과 동일한 완료 포트 스레드입니다. 일반적으로 대부분의 I/O 바인딩 된 작업에 대 한 새로운 기본 제공 비동기 메서드를 사용 하는 것이 좋습니다., 하지만이 경우 우리는 서버 메모리에서 명시적으로 버퍼링 하지 않고 거 대 한 파일을 전송 하는 뛰어난 기능 으로 인해 HttpResponse.TransmitFile 함수를 사용 하 고 싶 었 어 요. 놀라워요! IIS 웹 서버는 이미 확장성이 뛰어난 엔터프라이즈급 웹 서버로 입증되어 수년 동안 브라우저에 파일을 제공합니다. 기본적으로 많은 HTTP 웹 요청을 동시에 처리하고 파일 다운로드(복사)에 적용하는 IIS 웹 서버의 기능을 활용하고자 했습니다.

그림 1 DownloadHandler.dll에 대한 처리 흐름의 높은 수준의 디자인 개요 (FileDownloader.exe 클라이언트로 사용) 둘째, 프론트 엔드 클라이언트 (FileDownloader.exe) 및 백 엔드 서버 (DownloadHandler.dll) 내부의 샘플 프로젝트 코드는 HTTP 의정서의 부분 콘텐츠 바이트 범위를 용이하게하는 데 필요한 HTTP 요청 및 응답 헤더의 사용을 보여주는 샘플 코드의 간단하고 명확한 블록역할을 할 수 있습니다.

0