WCF服务已知类型对象不会返回已知类型的属性

时间:2013-02-14 16:30:12

标签: vb.net wcf object known-types

我创建了一个WCF服务,并有两个特定的对象,Contact和Driver。驱动程序继承联系人。 Contact对象是较大的Member对象的一部分。在代码中我有以下内容:

<DataContract()>
Public Class Contact
    <DataMember()>
    Public Name As String
    <DataMember()>
    Public HomePhone As String
    ... etc.
End Class

<DataContract()>
Public Class Driver
    Inherits Contact
    <DataMember()>
    Public LicenseNum As String
    <DataMember()>
    Public LicenseState As String
    ... etc.
End Class

<DataContract(), KnownType(GetType(Driver))>
Public Class Member
    <DataMember()>
    Public Info As Contact
    <DataMember()>
    Public PrimaryStore As Store
    ... etc.
End Class

因为我在datacontract行上有知识类型,所以我可以使用Info属性创建一个Member对象作为Driver而不是Contact,这样我就可以保存他们的许可证信息。

我的问题是,当我创建一个测试项目来查看返回的数据时,我在调用Info属性时无法获取许可证信息。

Dim svc as New Service.RetrieveService
Dim sMember as Member
Dim memNum as String = "ABC123"
sMember = svc.GetMember(memNum)
Console.WriteLine("LicenseNumber" & sMember.Info...PROBLEM!!!)

sMember.Info仅向我提供属于联系人(姓名,HomePhone等)的属性,且不属于Driver(LicenseNum,LicenseState等)。如何访问此信息?

我已经尝试将ServiceKnownType添加到我的OperationContract中,如下所示:

<ServiceContract()>
Public Interface RetrieveMember
    <OperationContract(), ServiceKnownType(GetType(Driver))>
    Function GetMember(ByVal memberNumber as String) As Member
End Interface

但它没有帮助。

1 个答案:

答案 0 :(得分:1)

这是因为Member.Info属性被定义为Contact类型。这意味着,即使它引用了Driver对象,它仍将被转换为Contact对象,因此只有那些基本成员才可见。这是一个与WCF无关的问题。例如,即使从这种情况中删除WCF,您仍然会遇到同样的问题:

Dim m As New Member()
m.Info = New Driver()
Console.WriteLine(m.Contact.LicenseNum)  ' Won't compile!

因此,如果Info属性引用Driver对象,则必须先将其强制转换为该类型,然后才能访问任何Driver成员:

Dim m As Member
' ...
If TypeOf m.Info Is Driver Then
    Dim d As Driver = CType(m.Info, Driver)
    Console.WriteLine(d.LicenseNum)  ' Works fine
End if
相关问题