我可以在 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; }
}
需要你的帮助..
最佳答案
您可以使用继承来定义两个消息契约之间的关系:
[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) 并发送单个流。
关于c# - 在 WCF 的其他契约(Contract)中将 MessageContract 作为 MessageBodyMember,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7899079/