在 WCF 中使用继承层次结构创建消息协定类型

本文关键字:消息 创建 类型 层次结构 继承 WCF | 更新日期: 2023-09-27 17:58:48

我正在使用.NET WCF开发一个Web服务e。我正在使用这样的令人印象深刻的服务风格:

[ServiceContract]
public interface IMyService {
   [OperationContract]
   MyMessageResponse MyOperation(MyMessageRequest msg);
}

好吧,我想将MessageContractAttribute应用于MyMessageResponseMyMessageRequest,因为我需要以自己的方式调整 SOAP。

好吧,问题是MyMessageResponseMyMessageRequest是层次结构的一部分(我有许多服务操作,因此,许多消息类型(。

假设我的层次结构是这个(类继承伪代码(:

MyMessage <- MyMessageFamily1 <- MyMessageRequest
MyMessage <- MyMessageFamily1 <- MyMessageResponse
MyMessage <- MyMessageFamily2 <- MyOtherMessageRequest
MyMessage <- MyMessageFamily2 <- MyOtherMessageResponse

我想将MessageContractAttribute应用于MyMessage,然后应用于MyMessageFamily1,然后应用于MyMessageRequestMyMessageResponse(对于其他人来说也是如此(,如下所示:

[MessageContract(...)]
public class MyMessage {
   [MessageBodyMember(...)]
   public MyType1 Member1; /* MyType1 has a DataContract applied */
   [MessageBodyMember(...)]
   public MyType2 Member2; /* MyType2 has a DataContract applied */
}
[MessageContract(...)]
public class MyMessageFamily1 : MyMessage {
   [MessageBodyMember(...)]
   public MyType3 MemberFamily11; /* MyType3 has a DataContract applied */
   [MessageBodyMember(...)]
   public MyType3 MemberFamily12; 
}
[MessageContract(...)]
public class MyMessageFamily2 : MyMessage {
   [MessageBodyMember(...)]
   public MyType3 MemberFamily21; /* MyType3 has a DataContract applied */
   [MessageBodyMember(...)]
   public MyType3 MemberFamily22; 
}
[MessageContract(...)]
public class MyMessageRequest : MyMessageFamily1 {
   [MessageBodyMember(...)]
   public MyType4 MemberRequest1; /* MyType4 has a DataContract applied */
   [MessageBodyMember(...)]
   public MyType4 MemberRequest2; 
}
[MessageContract(...)]
public class MyMessageResponse : MyMessageFamily1 {
   [MessageBodyMember(...)]
   public MyType4 MemberResponse1; 
   [MessageBodyMember(...)]
   public MyType4 MemberResponse2; 
}
[MessageContract(...)]
public class MyOtherMessageRequest : MyMessageFamily2 {
   [MessageBodyMember(...)]
   public MyType5 MemberRequest1; /* MyType5 has a DataContract applied */
   [MessageBodyMember(...)]
   public MyType5 MemberRequest2; 
}
[MessageContract(...)]
public class MyOtherMessageResponse : MyMessageFamily2 {
   [MessageBodyMember(...)]
   public MyType5 MemberResponse1; 
   [MessageBodyMember(...)]
   public MyType5 MemberResponse2; 
}

问题:MessageContractAttribute属性 tat 可以继承,但 MessageBodyMemberAttributeMessageHeaderAttribute 不会继承,因为它们的定义。

问题是我想创建一个实现IMyService的服务。 IMyService有使用MyMessageResponseMyMessageRequest MyOperation。但是MyMessageResponse应该继承MemberFamily11MemberFamily12Member1Member2,并在肥皂信息中处理它们,以便将它们放在肥皂信息的正文中。但是MessageBodyMemberAttribute不是继承的...

如何解决这个问题?

在 WCF 中使用继承层次结构创建消息协定类型

您可以这样做,但这可能不是执行 XML SOAP 服务的最佳方式,因为您的服务定义是由实现驱动的,而不是相反。 .NET 和 C# 是一个结果,而不是契约。

我的建议是创建具体类型,而不是使用派生或层次结构。 这类问题在 XSD 架构优先的 SOAP 开发中很容易发现和纠正 - 1。

希望这有帮助


1 有关架构优先的更多信息,请参见此处