【问题标题】:WCF Service known type object won't return properties of the known typeWCF 服务已知类型对象不会返回已知类型的属性
【发布时间】:2013-02-15 00:43:15
【问题描述】:

我创建了一个 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 行上有 knowntype,所以我可以创建一个具有 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 只给我属于联系人的属性(姓名、家庭电话等),而没有属于司机的属性(LicenseNum、LicenseState 等)我如何访问这些信息?

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

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

但它没有帮助。

【问题讨论】:

    标签: vb.net wcf object known-types


    【解决方案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
    

    【讨论】:

    • 成功了!我只是想知道是否有一些新方法,因为它是被调用的 WCF 服务。让我想知道调用您的服务的人怎么会知道这些特定项目的投射方式与服务显示的不同。
    猜你喜欢
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多