2010-01-15 3 views
5

스트리밍을 사용하여 대용량 파일을 전송해야하는 WCF 서비스를 작성했지만 사용자 정의 초기화를해야합니다.netTcpBinding에서 세션과 스트리밍을 모두 활성화하는 방법이 있습니까?

문제는 사용자 이름을 얻고 매번 초기화를 수행하는 것이 매우 비싸다는 것입니다. 세션을 켤 수만 있다면, 초기화 된 데이터를 서비스 인스턴스의 로컬 변수에 저장할 수 있습니다.

netTcpBinding에서 스트리밍과 세션을 모두 켤 수 있습니까?

답변

4

대용량 파일 전송은 실제로 wcf에서 문제가되며 스트리밍 옵션으로는 아무 것도 해결하지 못합니다 (서버에서 더 많은 메모리가 필요함).

소켓을 사용하지 않으려면 블록으로 파일을 분할하고 별도의 블록 만 전송하는 자체 "프로토콜"을 구현할 때 문제를 해결할 수 있습니다. 나는 reliableSessions와 TransportWithMessageCredential을 사용했다.

[ServiceContract(CallbackContract = typeof(IClient), SessionMode = SessionMode.Required)] 
public interface IServer 
{ 
    [OperationContract] 
    FilePart GetFileChunk(string identifier, int number, int blockSize); 
} 

DataContract으로이 같은 것을 사용할 수 있습니다 :

[DataContract] 
public class FilePart 
{ 
    [DataMember] public int Part; 
    [DataMember] public byte[] Data; 
    [DataMember] public int BlockSize; 
} 

은 당신이 가지고있는 "오른쪽"블록 크기를 찾으려면

[서버 (또는 클라이언트) 인터페이스는 다음과 같이 보입니다 약간 놀아 라, 나는 약 64-512 kb를 추천한다. 크기가 너무 작 으면 요청이 많으며 속도가 느려지고 서버 측에 더 많은 부하가 발생합니다.

maxReceivedMessageSize, maxBufferSize 및 제한 시간이 (바인딩 구성에서) 충분히 크고 판독기 할당량도 중요합니다. 테스트를 위해 모든 필드에 최대 값을 사용하는 것이 좋습니다. 더 잘 맞는 값을 사용하면됩니다.

양면 바인딩으로 작업하는 경우 ref를 사용하여 개체를 전달할 수 있습니다. 당신이 전송 등의 진행 상황을 볼 수 잘 그래서이 방법을 사용하면

[OperationContract IsOneWay=true] 
FilePart GetFileChunk(string identifier, int number, int blockSize, ref TransferState callback); 

나는 이것이 내가 줄 수있는 모든 트릭과 힌트가 생각 ..., 콜백 객체를 전달할 수 있습니다. 나는 그것이 도움이되기를 바랍니다.

+1

"큰 크기"로 생각하는 크기는 무엇입니까? – flayn

+0

빌드하려는 대상에 따라 ... 적절한 구성으로 파일을 분할하지 않고 파일을 50MB 이상으로 전송할 수 있지만 wcf 스트리밍 옵션을 활성화해야합니다. 스트리밍 옵션을 사용하면 서버의 메모리 사용량이 메시지 전송 파일 덩어리보다 높습니다. 따라서 높은로드를 처리해야하는 경우 더 나은 방법이 될 수 있습니다. – CaptainPlanet

1

대용량 파일을 전송하는 데 WCF가 적절하지 않다고 생각합니다. 대신 WCF가 System.Net.Sockets를 사용하도록하십시오.

관련 문제