1

我可以在 WCF 中使用递归 MessageContract 吗?例如 :

我需要发布一些参数,其中一个参数是文件流数组。这是我的 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; }
}

需要你的帮助..

4

2 回答 2

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因为您不能拥有消息头数组,而且 Stream 在大多数情况下可能是唯一可用的正文元素,而且它必须只有一个。因此,如果您需要传递多个文件,您还应该实施一些压缩 (zip) 并发送单个流。

于 2011-10-26T08:39:26.793 回答
1

快速回答:不,你不能。消息契约是 SOAP 消息的顶级定义,而不是可以组合的东西。在您的示例中,您将Files成员定义为在正文中,但其某些属性(FileName, FileSize)在不一致的标头中。如果您尝试它甚至可以“工作”,那么您将不会看到任何错误,而仅仅是因为 WCF 会将FileUploadInputParameter类型视为 POCO 可序列化类型。

于 2011-10-26T16:08:02.430 回答