【问题标题】:WCF, return list of Known TypesWCF,返回已知类型列表
【发布时间】:2011-06-22 08:24:09
【问题描述】:

我有一个名为ConstructionManager 的服务器端服务,它的一个操作是GetAll(),它返回一个构造列表。 Construction 是一个数据契约,继承自 Construction 有几种类型(BuildingsApartments 等)

当我发送公寓列表时,一切都很好,所有属性都在他们的位置,但是当我在客户端收到该列表,并在运行时查看接收到的对象中的内容时,我在非公共成员中看到了所有特定于从Construction 继承的类型的属性,例如RoomsFloor,但在结果视图中,它显示所有属性的值都是“0”,而不是发送它们的值。

在数据契约构造中,在类的顶部,是继承类的 KnownType 属性。

了解一下可能会有所帮助,我使用的是 Web Service Software Factory。

对不起,我的英语不好。

【问题讨论】:

  • 贴一段代码(实体和服务方法签名),并在问题描述中稍微清楚一点。
  • 我已经编辑了这个问题,试图让它更清楚一点,如果有什么看起来不对的地方,请告诉我。是的,发布一些示例代码,显示合同以及在将对象发送回客户端之前如何填充对象。有一个测试用例,您只需创建一个带有硬编码值的公寓并将其发送给客户端并检查它可能会有所帮助。
  • 你显示的不是调用你的服务的结果,而是调用LocalConstructionReplace的结果与你的服务的结果。我先看看那里。我会设置一个简单的测试来验证行为。

标签: wcf web-services known-types


【解决方案1】:

如果您看到服务中的对象在之前中填充了属性,则它通过线路发送到客户端(即在序列化之前),然后看到接收到的对象丢失了这些属性中的值刚刚被客户端接收,这意味着它们在序列化过程中丢失了。

关于序列化,您需要记住两件事:

  1. 您需要确保通过网络发送的类都标有 [DataContract] 属性,并且其中的所有属性都标有 [DataMember] 属性。如果一个属性不是 .NET 类型,那么定义它的类(以及其中的属性)也需要用这些属性进行标记。

  2. 类继承在序列化中丢失。如果您创建“Building”类型的对象,并且您的 WCF 服务方法返回“Construction”类型,则发送到客户端的消息可能无法正确序列化(例如,它是否只能序列化基类型中定义的属性“建造”?)。我建议你通过让你的服务返回继承类型而不是基类型来测试这一点,看看它是否能解决问题。

我认为第二点是最有可能导致您出现问题的原因。如果您提供代码,我可以为您提供更详细的帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多