2012-10-09 61 views
3

是否有可能使用帶有MessageContract的WCF流式傳輸文件,該文件包含另一個包含其內部流的MessageContract?我認爲答案是否定的,但我更願意將我的文件打包到「Root」消息中。WCF Streaming文件問題

。換句話說我的設置是這樣的:

[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; 
} 

請求被髮送和接收到服務就好了,但是,它出現的流沒有被正確反序列化和回來的空引用。我知道我已經閱讀了一個規則,在一個MessageContract中聲明Streaming必須是MessageContract的主體,我認爲這就是現在被侵犯的內容。我希望將FileTransferMessage作爲Body,然後將Stream作爲Body的接口。

任何人有什麼建議我可以在這裏做什麼?我不想添加一個Stream/FileName/FileLength到我的傳輸對象。

回答

3

作爲設計MessageContract團隊的一員,我可以告訴你答案是否定的。MessageContract恰好代表了一個完整的SOAP消息,你不能將它們嵌套在一起(你的例子中的FileTransferMessage是隻需交給序列化程序,對[MessageContract]屬性一無所知並忽略它,並且對任何特殊的Stream行爲一無所知)。

創建自定義消息子類(甚至自定義流子類)的缺點,我想不出一個好的解決方案。如果每條消息都有fId和fTimestamp,請考慮使用自定義Message Inspector來注入這些消息,然後在您的操作中使用FileTransferMessage。

這裏

權威文件http://msdn.microsoft.com/en-us/library/ms730255.aspxhttp://msdn.microsoft.com/en-us/library/ms733742.aspx

+0

感謝尤金。我已經決定允許Stream在主要的MessageContract中,我只需要在應用程序文檔中調用它來證明原因。 – Tada