2010-06-08 8 views
2

소비자가 파일을 다운로드 할 수있는 webservice를 만들려고합니다 (매우 큰 파일 일 수 있음). 서버에서는 소비자에게 다시 보내야 할 파일이 많기 때문에 모든 파일을 하나의 큰 zip 파일로 압축하여 사용자에게 다시 스트리밍합니다. 바로 지금, 내 웹 서비스는 파일을 압축하기 시작합니다. 요청이 들어 오면 압축 파일을 만들고 압축을 풀 수 있습니다. 압축에는 많은 시간이 걸릴 수 있으며 요청이 시간 초과 될 수 있습니다. 그런 상황을 피하려면 어떻게해야합니까? 내 솔루션은 지금 데이터를 작은 zip 파일로 분리하고 소비자에게이 작은 파일이 많을 것이라는 응답을 보내고 소비자가 개별적인 작은 파일을 요청하도록합니다. 그래서 1GB의 zip 파일이 있다면 10 개의 작은 zip 파일로 나누어 소비자가 10 개의 요청에서 더 작은 파일을 요청하도록 요청할 것입니다. 이것이 올바른 접근 방법입니까? 어떤 문제에 직면 할 수 있습니까? 그러한 문제를 가진 사람은 누구입니까? 당신의 경험을 공유 할 수 있다면 기쁠 것입니다. 또한 완전히 압축하지 않고 zip 파일을 스트리밍 할 수 있습니까?C# webservice로 큰 파일을 다운로드하십시오.

답변

2

요청 및 배달을 비동기 작업으로 처리합니다.

클라이언트는 한 가지 방법으로 파일을 요청할 수 있습니다. 또 다른 방법은 클라이언트가 파일 패키징의 상태를 알 수있게합니다 (아직 다운로드 할 준비가되었는지 여부). 세 번째 방법은 실제로 파일을 다운로드 할 수 있습니다.

+0

어떤 예를 거기에 ...이 내용은 사이비입니다

byte[] GetFile() { response = request.Post(http://yourlocation/generatefile); string dataResource = response.Headers["Location"]; bool resourceReady = false; while(!reasourceReady) { resH = request.Header(dataResource); if(resH.Headers[Status] == "complete") break; else Thread.Sleep(OneSecond); ?? or whetever } fileRes = request.Get(dataResource); return fileRes.ToByteArray(); } 

,하지만 난 그게 말이 희망 : 클라이언트 코드는 다음과 같이 흐를 수 있는가? – Debby

0

편안한 접근 방법을 살펴 보는 것이 좋습니다. 비누 웹 서비스가 아닌. OrbMan은 asynch approach가 가장 좋을 것이라고 제안했습니다. 의 위치를 ​​알 수 (301)의 응답 코드 '수용'과 위치의 위치 헤더 값을 가진 HTTP 응답을 반환 http://yourlocation/generatefile 어떤 (게시물로 호출 할 때) = http://yourlocation/generatefile/id00124 : 당신이 자원 노출 될 수 나머지

자료.

그런 다음 http://yourlocation/generatefile/id00124 리소스 (헤더 요청 일 수도 있음)를 폴링하여 처리/완료 상태를 얻을 수 있습니다.

처리가 완료되었습니다. 파일을 다운로드하려면 http://yourlocation/generatefile/id00124을 타십시오. 응답 http 메시지는 파일 및 형식 (예 : 암호화 및 압축 유형)을 식별해야하므로 모든 소비자는이를 읽는 방법을 알고 있습니다.

이것은 장기간 실행되고 soap anbd general xml 이외의 형식으로 데이터를 반환하는 문제에 대한 좋은 해결책입니다.

나는 이것이 내가 파일을 얻는 방법의 일환으로 호출 클라이언트에서 폴링 것

+0

좋습니다. 질문이 있습니다. 리소스 상태를 폴링하려면 어떻게해야합니까? 이것이 너무 바보 같은 질문이라면 유감이지만 C# 및 Webservices 작업을 시작했습니다. – Debby

0

도움이되기를 바랍니다. 내가 참조 할 수있는

관련 문제