在 WCF 中使用继承层次结构创建消息协定类型
本文关键字:消息 创建 类型 层次结构 继承 WCF | 更新日期: 2023-09-27 17:58:48
我正在使用.NET WCF开发一个Web服务e。我正在使用这样的令人印象深刻的服务风格:
[ServiceContract]
public interface IMyService {
[OperationContract]
MyMessageResponse MyOperation(MyMessageRequest msg);
}
好吧,我想将MessageContractAttribute
应用于MyMessageResponse
和MyMessageRequest
,因为我需要以自己的方式调整 SOAP。
好吧,问题是MyMessageResponse
和MyMessageRequest
是层次结构的一部分(我有许多服务操作,因此,许多消息类型(。
假设我的层次结构是这个(类继承伪代码(:
MyMessage <- MyMessageFamily1 <- MyMessageRequest
MyMessage <- MyMessageFamily1 <- MyMessageResponse
MyMessage <- MyMessageFamily2 <- MyOtherMessageRequest
MyMessage <- MyMessageFamily2 <- MyOtherMessageResponse
我想将MessageContractAttribute
应用于MyMessage
,然后应用于MyMessageFamily1
,然后应用于MyMessageRequest
和MyMessageResponse
(对于其他人来说也是如此(,如下所示:
[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 可以继承,但 MessageBodyMemberAttribute
和 MessageHeaderAttribute
不会继承,因为它们的定义。
问题是我想创建一个实现IMyService
的服务。 IMyService
有使用MyMessageResponse
和MyMessageRequest
MyOperation
。但是MyMessageResponse
应该继承MemberFamily11
、MemberFamily12
、Member1
和Member2
,并在肥皂信息中处理它们,以便将它们放在肥皂信息的正文中。但是MessageBodyMemberAttribute
不是继承的...
如何解决这个问题?
您可以这样做,但这可能不是执行 XML SOAP 服务的最佳方式,因为您的服务定义是由实现驱动的,而不是相反。 .NET 和 C# 是一个结果,而不是契约。
我的建议是创建具体类型,而不是使用派生或层次结构。 这类问题在 XSD 架构优先的 SOAP 开发中很容易发现和纠正 - 1。
希望这有帮助
1 有关架构优先的更多信息,请参见此处