使用WCF中的继承层次结构创建MessageContract类型

时间:2011-06-09 07:46:32

标签: c# .net wcf web-services

我正在使用.NET WCF开发Web服务。我正在使用这样的消息服务风格:

[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是一个可以继承的属性,但由于其定义,MessageBodyMemberAttributeMessageHeaderAttribute不会继承。

问题是我想创建一个实现IMyService的服务。 IMyService MyOperation MyMessageResponse使用MyMessageRequestMyMessageResponse。 但是MemberFamily11应该继承MemberFamily12Member1Member2MessageBodyMemberAttribute并在soap消息中处理它们,以便将它们放在soap消息的正文中。但{{1}}不是继承的......

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

您可以这样做,但它可能不是执行XML SOAP服务的最佳方式,因为您的服务定义是由实现驱动而不是相反。 .net和c#是后果,而不是合同。

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

希望这会有所帮助


1可以找到有关架构优先的更多信息here