WCF没有使用ServiceKnownType序列化派生类型

时间:2017-02-03 00:19:04

标签: c# wcf serialization wsdl

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

[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只包含我们系统中常见的基本属性。

0 个答案:

没有答案