2011-10-26 24 views
1

我可以在WCF中使用遞歸的MessageContract嗎?例如: :將MessageContact作爲MessageBodyMember放置在WCF的其他合同中

我需要發佈一些參數,其中一個參數是文件流的數組。 這是我的OperationContract的:

DomainResult AddSomethingNew(int externalCustomerId, string domainName, bool isDefault, FileDataContract[] files); 

這裏是我的MessageContract:

[MessageContract] 
public class FileDataContract 
{   
    [MessageHeader(MustUnderstand=true)] 
    public int ExternalCustomerId { get; set; } 

    [MessageHeader(MustUnderstand=true)] 
    public string DomainName{get;set;} 

    [MessageHeader(MustUnderstand=true)] 
    public bool IsDefault{get;set;} 

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

[MessageContract] 
public class FileUploadInputParameter 
{ 
    [MessageHeader(MustUnderstand = true)] 
    public string FileName { get; set; } 

    [MessageHeader(MustUnderstand = true)] 
    public decimal FileSize { get; set; } 

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

需要你的幫助..

+0

我沒有看到任何遞歸 - 我看到您的服務操作中的消息合約數組,但應該沒問題。 – Tim

+0

對不起Tim,我的意思是我們可以使用MessageContract作爲另一個MessageContract成員嗎?我需要一個messagecontract其中一個成員是另一個messagecontract數組.. –

+0

關閉我的頭頂我不明白爲什麼不。我無法100%確定你可以確定你不能回答。你有沒有試過看它是否有效? – Tim

回答

3

您可以使用繼承來兩個消息之間的合同關係定義:

[MessageContract] 
public class FileUploadInputParameter 
{ 
    [MessageHeader(MustUnderstand = true)] 
    public string FileName { get; set; } 

    [MessageHeader(MustUnderstand = true)] 
    public decimal FileSize { get; set; } 

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

[MessageContract] 
public class FileDataContract : FileUploadInputParameter 
{   
    [MessageHeader(MustUnderstand=true)] 
    public int ExternalCustomerId { get; set; } 

    [MessageHeader(MustUnderstand=true)] 
    public string DomainName{get;set;} 

    [MessageHeader(MustUnderstand=true)] 
    public bool IsDefault{get;set;} 
} 

正如你描述的那樣,你不能定義消息契約由於您不能擁有消息頭數組和更多,所以在FileDataContract中使用流。在大多數情況下,流可以是唯一可用的body元素,並且它只能是一個。所以如果你需要傳遞多個文件,你還應該實現一些壓縮(zip)併發送單個流。

1

快速回答:不,你不能。消息協定是SOAP消息的頂層定義,而不是可以組成的東西。在您的示例中,您將Files成員定義在正文中,但其某些屬性(FileName,FileSize)位於不一致的標題中。如果你試圖說它甚至可能「工作」,那麼你將不會看到任何錯誤,但僅僅是因爲WCF會將FileUploadInputParameter類型視爲POCO可序列化類型。

相關問題