4

我在 WCF 服务中创建了一些数据类,以在服务和客户端之间来回传输数据。因此,这些“对象”用 [ServiceContract] 和 [DataMember] 装饰,因此暴露给客户端,以便我可以实例化一个,填充它并将其发送到服务。现在,我注意到我可以在服务中使用多态性,但是我在客户端和服务之间没有那么幸运。例如

在服务中,有一个名为 Ticket 的类和一个从 Ticket 派生的名为 MOCTicket 的类。还有一种方法接受 Ticket 作为参数。通常,我应该能够向该方法发送一个 MOCTicket 对象,并且它会正常工作,因为它派生自 Ticket,并且我可以在服务中执行此操作。但是,如果我在 CLIENT 端实例化 MOCTicket 对象并尝试将其发送到接受 Ticket 的服务方法,则会引发错误。我猜这是一个序列化问题。

我只是对我可以从这些数据类中获得的那种行为感到困惑。你得到一些但没有其他的。就像我不能序列化行为/方法或构造函数一样,但我可以序列化延迟加载的属性(或者看起来如此)。无论如何,如果有人可以帮助我实现我上面描述的或者如果有可能的话。任何关于这些“对象”的额外说明也将不胜感激。我用谷歌搜索试图找到答案,但找不到任何写得足够清楚来回答这个问题的东西。谢谢。

4

2 回答 2

3

您是否尝试过传递接口并使用 ServiceKnownType 属性,而不是向/从服务传递类?

有关示例,请参见链接。

于 2012-06-01T15:25:49.620 回答
1

我想我找到了我要找的东西,至少在这个阶段。通过向服务方法添加额外的装饰,我可以告诉序列化程序期望什么类型:

[ServiceContract]
public interface IService1
{
    [OperationContract]
    [ServiceKnownType(typeof(SvcBaseTicket))]
    [ServiceKnownType(typeof(SvcMOCTicket))]
    bool DoStuff(SvcBaseTicket user);
}

然后像这样调用将起作用:

using(var client = new MyClient())
{
   var ticket = new SvcMOCTicket();
   if(client.DoStuff(ticket))
   {
      //do things
   }
}

我进行了测试以确保返回“基类”类型的服务类实际上是变相的派生类,并且返回了所有附加属性,并且确实如此。以及一个名为“ExtensionData”的新属性。奇妙吧。

于 2012-06-01T16:26:00.453 回答