2011-05-04 4 views
1

x/html 페이지와 파일을 인터넷에서 올바르게 다운로드 할 수있는 코드 스 니펫이 꽤 많습니다. 대부분의 경우 꽤 잘 작동합니다.flakey 네트워크에서의 강력한 네트워크 연결 처리

불행히도, 자택 인터넷 연결은 자정부터 6시 사이에 거의 사용할 수 없게됩니다. 패킷 손실이 많이 발생하고 연결이 지연됩니다. 마찬가지로 네트워크 부하에 따라 일시적인 정전이 발생하는 직장에서 백업 3G 연결이 있습니다.

물론 다운로드 코드를 try/catch에 넣을 수는 있습니다.하지만 시간이 얼마나 걸리더라도 파일을 올바르게 다운로드하는 것이 이상적입니다.

나는 이것을 해결하기 위해 많은 노력을 기울였으며 성공을 거뒀다.

캡처중인 스트림의 길이를 가져오고 로컬 복사본의 길이가 동일한 지 확인했습니다. 어떤 이유로 (정확하게 다운로드 된) 로컬 복사본은 항상보고 된 스트림의 길이보다 몇 12 바이트 더 짧지 만 실제 크기는 더 짧았던 것처럼 보였습니다. 또한 모든 스트림이 길이를 사용할 수있는 것은 아닙니다.

또한 try/catch'd 세그먼트를 for 루프에 넣어서 시도해 보았습니다. 다운로드를 50 번 시도해 보았습니다. 성공적인 다운로드는 중단되지만 실패한 사용자는 다시 시도합니다.

나는 점차적으로 증가하는 지연으로 위의 내용을 보완했다. Thread.Sleep()은 반복적으로 시도하기 전에 각 반복마다 점차 길게 길게 잠을 자곤했다.

스팀, 크롬, 윈도우 업데이트, 아이튠즈 등 내 개인 소프트웨어가 많아서이 작업이 쉽지 않을 거라고 상상해보십시오. . 나는 종종 성공적으로 내려 오기 전에 대용량 파일을 10-15 번 다운로드하려고 시도해야한다. 이러한 devs는 연결 문제를 처리하는 데 신경 쓰지 않거나 수행하기 어렵습니다.

가능하다면 누군가 인터넷을 통해 스트림을 가져 오는 코드 스 니펫을 제공 할 수 있습니까? 그러나 벗겨지기 쉬운 연결을 처리 할 수 ​​있습니까? 나는 기존 솔루션에보고 제안

public static MemoryStream Fetch(string url, int? maxRetries, int? maxDuration) 
{ 
    // Download the response of the url to a MemoryStream. 
    // Assume if null maxRetries and maxDuration, keep trying forever. 
} 

답변

0

:

나는 뭔가 같이해야한다 상상한다. 내 첫 번째 생각은 BITS 또는 쉘을 Robocopy으로 사용하는 것입니다. 둘 다 잠재적으로 불안정한 네트워크에서 파일을 다운로드 할 때 잘 검사됩니다 (BITS는 Windows Update를 사용하여 컴퓨터에 업데이트를 다운로드하는 것입니다).