【发布时间】:2009-08-18 17:28:02
【问题描述】:
设置
我有一个 WCF 服务,它公开了一个基本类型(例如 Animal)以及一些派生类型(例如 Lion、Tiger 和 Bear)。另一种类型(例如 Zoo)包括一个作为基本类型集合的属性。基类型是具体的,不是抽象的,因此集合包含基类型和/或派生类型(以任何组合形式)的实例是完全可以接受的。例如:
[DataContract, KnownType(typeof(Lion)),
KnownType(typeof(Tiger)), KnownType(typeof(Bear))]
public class Animal
{
[DataMember]
public string Species { get; set; }
}
[DataContract]
public class Lion : Animal { }
[DataContract]
public class Tiger : Animal { }
[DataContract]
public class Bear : Animal { }
[DataContract]
public class Zoo
{
[DataMember]
public List<Animal> Animals { get; set; }
}
我的一个服务操作接受此类型作为其参数,如下所示:
[ServiceContract]
public interface IZooService
{
[OperationContract]
void SetZoo(Zoo zoo);
}
所有这一切都很好,发出的 WSDL 对我来说看起来非常好。它包含所有类型并正确指示派生类型继承自基类型。因此,我应该能够使用如下所示的 SOAP 消息调用我的服务:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:z="http://zoo.org">
<soapenv:Header/>
<soapenv:Body>
<z:SetZoo>
<z:Zoo>
<z:Animals>
<z:Animal>
<z:Species>Crocodile</z:Species>
</z:Animal>
<z:Tiger>
<z:Species>Bengal</z:Species>
</z:Tiger>
<z:Bear>
<z:Species>Grizzly</z:Species>
</z:Bear>
</z:Animals>
</z:Zoo>
</z:SetZoo>
</soapenv:Body>
</soapenv:Envelope>
在上述 SOAP 消息中,Animals 集合包含一个基本 Animal 类型的实例、一个派生 Tiger 类型的实例和一个派生 Bear 类型的实例。 WCF 应该能够成功反序列化此消息。
问题
WCF 在收到上述消息时不会抛出任何异常。相反,它只是完全忽略了派生类型(Tiger 和 Bear),当反序列化消息传递给我的代码时,Animals 集合仅包含 Crocodile 条目,因为它是基类型。
所以,我想我有两个问题...首先,为什么 WCF 不反序列化集合中的派生类型实例。其次,既然 WCF 显然不喜欢这个 SOAP 消息,为什么不抛出异常呢?这种无声无息的失败非常令人不安。
【问题讨论】:
标签: wcf inheritance soap collections wsdl