是否可以在具有SOAP对象的服务上使用多态?

时间:2012-06-01 15:22:32

标签: .net wcf serialization polymorphism

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

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

我只是对可以获取这些数据类的行为感到困惑。你得到一些而不是其他人。就像我无法序列化行为/方法或构造函数,但我可以序列化一个延迟加载的属性(或者看起来似乎)。无论如何,如果有人可以帮助我实现我上面描述的或者是否可能。关于这些“对象”的任何其他说明也将受到赞赏。我在谷歌周围试图找到答案,但找不到任何清楚的答案来回答这个问题。感谢。

2 个答案:

答案 0 :(得分:3)

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

有关示例,请参阅link

答案 1 :(得分: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”的新属性。 WUNDERBAR。