2010-07-21 3 views
3

요청하는 모든 클라이언트에 Zip 파일 (50MB)이 포함 된 바이트 배열을 반환하는 WCF 서비스가 있습니다. Zip이 매우 작 으면 (예 : 1MB), SOAP 응답은 바이트 배열이 포함 된 WCF에서옵니다. 그러나 1MB 파일의 경우에도 응답 크기가 매우 큽니다. 50MB 파일을 전송하려고하면 SOAP 응답이 크기가 커지기 때문에 서비스가 중지되고 메모리 부족 예외가 발생합니다.WCF 서비스를 사용하여 SOAP을 통해 모든 클라이언트로 큰 Zip 파일 (50MB)을 전송하는 방법은 무엇입니까?

  1. 큰 파일을 전송하는 WCF/웹 서비스에서 사용할 수있는 최선의 선택 (주로 ZIP 형식) 내가 바이트 배열을 다시 보내고로 무엇입니까. 파일을 다시 전송하는 대신에 좋은 방법이 있습니까?

  2. WCF/웹 서비스가 대용량 파일을 모든 클라이언트로 전송하는 가장 좋은 방법인지 또는 10,000 명의 사용자에 대한 상호 운용성 및 확장 성을 달성 할 수있는 다른 더 나은 옵션/기술이 있습니까?

내 CCODE은 다음과 같습니다 : 정보의

 String pathfordownload = @"D:\New Folder.zip"; 
     FileStream F2D = new FileStream(pathfordownload, FileMode.Open,FileAccess.Read); 
     BinaryReader binReader = new BinaryReader(F2D); 
     binReader.BaseStream.Position = 0; 
     byte[] binFile = binReader.ReadBytes(Convert.ToInt32 (binReader.BaseStream.Length)); 
     binReader.Close(); 
     return binFile; 

실제로 동작하는 조각/실제 조각이 나는 구글에서 사용할 수있는 모든 데이터와 함께 고군분투하고 마지막에 대한 좋은 결과를 없었다대로 정말 도움이 될 것입니다 주.

답변

4

Stream through WCF을 전송하면 거의 제한없는 길이의 파일을 전송할 수 있습니다.

2

나는 똑같은 문제에 직면 해있다. Byte 배열을 사용하기 때문에 메모리가 부족합니다.

우리가 한 일은 하드 드라이브의 데이터를 플러시하는 것이 었습니다. 따라서 가상 메모리로 제한되는 대신 동시 트랜잭션을위한 용량은 HD 공간입니다.

그런 다음 전송을 위해 파일을 다른 컴퓨터에 저장했습니다. 물론 우리의 경우에는 파일을 서버로 전송하는 서버였습니다. 분리 된 형태의 피어를 원하면 http에서 파일 다운로드를 사용할 수 있습니다.

그래서 파일로 응답하는 대신 서비스가 파일 위치에 http url로 응답 할 수 있습니다. 그런 다음 클라이언트가 표준 HttpRequest 또는 WebClient를 사용하여 서버를 성공적으로 다운로드하면 파일을 삭제하는 메소드가 호출됩니다. SOAP에서 삭제 (문자열 url) 일 수 있으며, REST에서는 해당 자원에 대한 삭제 메소드입니다.

나는 이것이 당신에게 의미가 있기를 바랍니다. 이것의 가장 중요한 부분은 확장 성있는 소프트웨어에서 특히 10000 개의 클라이언트 (동시?)를보고있는 경우 메모리 스트림이나 바이트 배열과 같은 제한된 리소스를 사용할 수 없다는 점을 이해하는 것입니다. 그러나 결국 SAN에있는 하드 드라이브 파티션과 같이 크고 쉽게 확장 할 수있는 리소스에 의존하고 필요할 때 파티션을 확장 할 수 있습니다.

+0

나는 RESTFul WCF Services와 그 잘 작동 해 보았습니다. – Defendore

관련 문제