我想知道的是如何在WCF配置已知类型。 例如,我有一个Person类和一个Employee类。 Employee类Person类的sublass。 两个类标有[DataContract]
属性。
我不想硬编码已知类型的一类,就像把一个[ServiceKnownType(typeof(Employee))]
在Person类,使WCF就会知道,员工是人的一个子类。
现在,我加入到主机的App.config下面的XML配置:
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<system.runtime.serialization>
<dataContractSerializer>
<declaredTypes>
<add type="Person, WCFWithNoLibrary, Version=1.0.0.0,Culture=neutral,PublicKeyToken=null">
<knownType type="Employee, WCFWithNoLibrary, Version=1.0.0.0,Culture=neutral, PublicKeyToken=null" />
</add>
</declaredTypes>
</dataContractSerializer>
</system.runtime.serialization>
<system.serviceModel>
.......
</system.serviceModel>
</configuration>
我编译,运行在主机,加在客户服务参考,并添加一些代码,运行客户端。 但是,发生错误:
而试图反序列化消息的格式化抛出一个异常:尝试反序列化参数时出错
http://www.herbertsabanal.net:person
。 设置InnerException信息是“错误在第1个位置247元'http://www.herbertsabanal.net:person'
包含的数据'http://www.herbertsabanal.net/Data:Employee'
数据的合同。 解串器没有映射到本合同的任何类型的知识。 添加对应于“雇员”到已知类型的列表中的类型 - 例如,通过使用KnownTypeAttribute属性或通过将其添加到已知类型传递给DataContractSerializer的列表'。 请参阅的InnerException了解更多详情。
下面是数据合同:
[DataContract(Namespace="http://www.herbertsabanal.net/Data", Name="Person")]
class Person
{
string _name;
int _age;
[DataMember(Name="Name", Order=0)]
public string Name
{
get { return _name; }
set { _name = value; }
}
[DataMember(Name="Age", Order=1)]
public int Age
{
get { return _age; }
set { _age = value; }
}
}
[DataContract(Namespace="http://www.herbertsabanal.net/Data", Name="Employee")]
class Employee : Person
{
string _id;
[DataMember]
public string ID
{
get { return _id; }
set { _id = value; }
}
}
顺便说一句,我没有使用类库(WCF类库或非WCF类库)为我服务。 我只是简单的编码它的主体项目。
我想一定是在配置文件中的问题(请参见上面的配置文件)。 或者,我一定是失去了一些东西。 任何帮助将非常感激。