2012-10-09 4 views
3

스트림이있는 다른 MessageContract가 포함 된 MessageContract를 사용하여 WCF를 사용하여 파일을 스트리밍 할 수 있습니까? 나는 그 대답이 "아니오"라고 생각하지만, 나는 "뿌리"메시지 안에 내 파일을 담아 말하는 것을 선호한다. otherwords에서WCF 스트리밍 파일 문제

내 설정은 다음과 같이이다 :

[MessageContract] 
public class Transport 
{ 
    [MessageHeader] 
    private readonly Guid fId; 

    [MessageHeader] 
    private readonly DateTime fTimestamp; 

    [MessageBodyMember(Order = 1)] 
    public FileTransferMessage FileTransferMessage { get; set; } 
} 

[MessageContract] 
public class FileTransferMessage : IDisposable 
{ 
    [MessageBodyMember(Order = 1)] 
    public Stream FileByteStream; 

    [MessageHeader(MustUnderstand = true)] 
    public long FileLength; 

    [MessageHeader(MustUnderstand = true)] 
    public string FileName; 
} 

요청이 전송 및 서비스에 잘 수신, 그러나, 스트림이 제대로 직렬화 다시 같은 null 참조오고되지 않는 나타납니다. 나는 Stream이 MessageContract의 Body가되어야한다는 것을 Streaming과 함께 MessageContract에있는 규칙을 읽고 어딘가에 규칙을 읽었다는 것을 알고있다. 나는 FileTransferMessage가 Body이고 Stream이 Body라는 것을 받아 들일 수 있기를 바랬습니다.

누구든지 여기에서 내가 할 수있는 것에 대해 의견이 있습니까? 나는 Stream/FileName/FileLength를 Transport 객체에 추가하지 않기를 바란다.

답변

3

MessageContract를 디자인하는 팀원 중 한 사람인 저는 답변이 없다는 것을 말할 수 있습니다 :) MessageContract는 정확히 하나의 전체 SOAP 메시지를 나타냅니다. 서로 중첩 할 수 없습니다 (예제의 FileTransferMessage는 단순히 [MessageContract] 속성에 대해 알지 못하는 serializer에 넘겨주고 무시하며 특수한 Stream 비헤이비어에 대해서는 아무것도 모릅니다.

커스텀 메시지 서브 클래스 (또는 커스텀 스트림 서브 클래스)를 만드는 것보다 짧아서, 나는 좋은 해결책을 생각할 수 없다. 모든 메시지에 fId 및 fTimestamp가있는 경우 사용자 지정 메시지 검사기를 사용하여 이러한 메시지를 주입 한 다음 작업에서 FileTransferMessage를 사용하는 것이 좋습니다. 여기

권위있는 문서 http://msdn.microsoft.com/en-us/library/ms730255.aspxhttp://msdn.microsoft.com/en-us/library/ms733742.aspx

+0

감사 유진 있습니다. Stream을 메인 MessageContract에 넣을 수 있도록 결정했기 때문에 이유를 정당화하기 위해 응용 프로그램 문서에서 Stream을 호출해야 할 것입니다. – Tada