2009-12-20 5 views
13

사람들이 대용량 파일 (64MB-1GB)을 내 서버에 업로드해야하는 프로젝트에 WCF를 사용하려고합니다. WCF로 어떻게 처리 할 것인가? 아마도 업로드를 다시 시작할 수있을 것이다.WCF를 통해 대용량 파일을 처리하는 방법은 무엇입니까?

더 큰 고객 기반을 처리하기 위해 WCF를 통해 JSON을 테스트하고 싶습니다. 이것이 파일 업로드에 어떤 영향을 미칩니 까? JSON에서 수행 할 수 있습니까, 아니면 업로드 부분을 REST로 전환해야합니까?

답변

15

대용량 파일을 업로드하려면 WCF Streaming Mode을 조사해야합니다.

기본적으로 바인딩에서 전송 모드를 변경할 수 있습니다. 기본적으로 메시지는 버퍼링됩니다. 즉, 전체 메시지를 발신자에서 버퍼링하고 일련 화 한 다음 전체적으로 전송해야합니다.

스트리밍을 사용하면 단방향 스트리밍 (다운로드 전용, 다운로드 전용) 또는 양방향 스트리밍 중 하나를 정의 할 수 있습니다. 바인딩의 transferMode를 StreamedRequest, StreamedResponse 또는 보통 Streamed으로 설정하면됩니다.

<bindings> 
    <basicHttpBinding> 
     <binding name="HttpStreaming" 
       maxReceivedMessageSize="2000000" 
       transferMode="StreamedRequest"/> 
    </basicHttpBinding> 
</bindings> 

그런 다음 당신도 (업로드) 유형 Stream의 매개 변수를 수신, 또는 (다운로드) 유형 Stream의 값을 반환하는 서비스 계약이 필요합니다.

[ServiceContract] 
public interface IFileUpload 
{ 
    [OperationContract] 
    bool UploadFile(Stream stream); 
} 

그렇게해야합니다!

+0

요청/응답이 특정 스키마를 따라야하는 경우 어떻게해야합니까? 즉, 요청이 특정 객체 여야 만하고 wsdl이이를 반영해야한다면? 스트림으로 어떻게이를 적용 할 수 있습니까? – Jeremy

+0

@ 제레미 : 제 응답은 다음과 같이 말합니다 : 스트리밍 전송을 사용하려는 경우 ** 오직 하나의 매개 변수 'Stream' (또는'Stream '유형의 반환 값)만을 사용할 수 있습니다. 이와 같이 서비스를 설계 할 수없고 다른 특정 요구 사항을 따라야하는 경우 불행히도 스트리밍 전송을 사용할 수 없습니다. 이 일을 할 수있는 마법 같은 방법은 없습니다. –

+0

@marc_s 단일 대형 문자열 매개 변수는 어떻습니까? [내 최근 질문] (https://stackoverflow.com/questions/48774474/parameter-size-limit-for-strings#comment84577011_48774474)이 중복으로 표시되었지만 적절한 매개 변수를 쉽게 설정할 수 있습니다. 1.2GB의'byte []'매개 변수 유형을 'byte []'에서'string'으로 변경하면 약 28mb로 제한됩니다. 필자는'string'을 매개 변수로 가져야합니다. – Franck

0

대용량 파일 업로드/다운로드를 위해 TransferMode streamed 및 단일 Stream 매개 변수 또는 스트림 응답 (적절한 경우)을 사용하여 webHttpBinding을 사용할 수 있지만, URL 및/또는 헤더를 통해 요청 메타 데이터를 보내야합니다. 스트림에서 자신의 프레이밍을 고안하려고합니다. 브라우저는 로컬 파일에 대한 무작위 액세스를 지원하지 않으며 일반 파일 업로드는 JSON이 아닌 양식 게시가 될 것이므로 Silverlight, Flash 등의 비 HTML 사용자 정의 클라이언트를 빌드해야합니다.

1

MTOM은 큰 바이너리 데이터를 처리하기 위해 최적화되어 있습니다.

+1

MTOM만으로는별로 도움이되지 않습니다. 여전히 전송할 전체 메시지를 버퍼에 모아야합니다. –

관련 문제