我们有一个WCF操作,在我们的服务 Contract 中声明如下:

[OperationContract]
[FaultContract(typeof(ErrorDetail))]
[ServiceKnownType(GetType(GetUserClassAdministratorResponse))]
[ServiceKnownType(GetType(GetUserClassSupervisorResponse))]
[ServiceKnownType(GetType(GetUserClassRegularResponse))]
public GetUserClassBaseResponse GetUserClass(request As GetUserClassRequest)

实现中的逻辑很简单,基本上从数据库中获取相应的用户并根据用户类实例化并填充相应的 GetUserClassAdministratorResponse / GetUserClassSupervisorResponse / GetUserClassRegularResponse .

我注意到WSDL引用了这些服务类型 . 也就是说,我可以看到WSDL中的三个类正确定义,作为GetUserClassBaseResponse的扩展 .

问题是GetUserClass的输出仅定义为BaseResponse .

<wsdl:operation name="GetUserClass">
    <!-- SNIP -->
    <wsdl:output name="GetUserClassBaseResponse">
        <soap:body use="literal"/>
    </wsdl:output>
    <wsdl:fault name="ErrorDetailFault">
        <soap:fault use="literal" name="ErrorDetailFault" namespace=""/>
    </wsdl:fault>
</wsdl:operation>

因此,对象(无论其实际类型)被序列化为 GetUserClassBaseResponse ,因此消费者无法看到相应类中包含的额外细节 .

为了兴趣, GetUserClassBaseResponse 被定义为:

[DataContract(Namespace = “{namespace}”)]
[MessageContract]
public abstract class GetUserClassBaseResponse : BaseResponse
{
    // Properties with [MessageBodyMember] and [DataMember]
}

BaseResponse 只包含我们系统中常见的基本属性 .