C# 将MessageContract作为MessageBodyMember放入WCF中的其他合约中

C# 将MessageContract作为MessageBodyMember放入WCF中的其他合约中,c#,.net,wcf,soap,messagecontract,C#,.net,Wcf,Soap,Messagecontract,我可以在WCF中使用递归MessageContract吗? 例如: 我需要发布一些参数,其中一个参数是文件流数组。 这是我的经营合同: DomainResult AddSomethingNew(int externalCustomerId, string domainName, bool isDefault, FileDataContract[] files); [MessageContract] public class FileDataContract { [Mes

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

我需要发布一些参数,其中一个参数是文件流数组。 这是我的经营合同:

DomainResult AddSomethingNew(int externalCustomerId, string domainName, bool isDefault, FileDataContract[] files);
[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; }
}
这是我的合同:

DomainResult AddSomethingNew(int externalCustomerId, string domainName, bool isDefault, FileDataContract[] files);
[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; }
}

需要您的帮助。

您可以使用继承来定义两个消息约定之间的关系:

[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
中所述定义消息约定,因为您不能有消息头数组,而且在大多数情况下,多个over-Stream可以是唯一可用的body元素,并且只能是一个。因此,如果您需要传递多个文件,您还应该实现一些压缩(zip)并发送单个流。

您可以使用继承来定义两个消息契约之间的关系:

[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
中所述定义消息约定,因为您不能有消息头数组,而且在大多数情况下,多个over-Stream可以是唯一可用的body元素,并且只能是一个。因此,如果您需要传递多个文件,您还应该实现一些压缩(zip)并发送单个流。

快速回答:不,您不能。消息契约是SOAP消息的顶级定义,而不是可以组合的东西。在您的示例中,您将
文件
成员定义为位于正文中,但其某些属性(
文件名
文件大小
)位于不一致的标题中。如果您尝试这样做,它甚至可能“起作用”,在某种程度上您不会看到任何错误,只是因为WCF将把
FileUploadInputParameter
类型视为POCO可序列化类型。

快速回答:不,您不能。消息契约是SOAP消息的顶级定义,而不是可以组合的东西。在您的示例中,您将
文件
成员定义为位于正文中,但其某些属性(
文件名
文件大小
)位于不一致的标题中。如果您尝试这样做,它甚至可能“起作用”,在某种程度上您不会看到任何错误,但这仅仅是因为WCF将把
FileUploadInputParameter
类型视为POCO可序列化类型。

我没有看到任何递归-我在您的服务操作中看到了一系列消息约定,但这应该没问题。对不起,Tim,我的意思是我们可以将MessageContract用作另一个MessageContract成员吗?我需要一个messagecontract,它的一个成员是另一个messagecontract的数组..我不知道为什么不。我不能给你一个100%的肯定,你可以或肯定你不能回答。你试过它了吗?我没有看到任何递归的东西-我在你的服务操作中看到了一系列消息契约,但那应该没问题。对不起,蒂姆,我的意思是我们可以将一个消息契约用作另一个消息契约成员吗?我需要一个messagecontract,它的一个成员是另一个messagecontract的数组..我不知道为什么不。我不能给你一个100%的肯定,你可以或肯定你不能回答。你试过了吗,看看是否有效?