我想知道如何在 WCF 中配置已知类型。例如,我有一个Person类和一个Employee班级。这Employee类是 的子类Person班级。两个类都标有[DataContract]
属性。
我不想对类的已知类型进行硬编码,例如将[ServiceKnownType(typeof(Employee))]
在 Person 类中,以便 WCF 知道 Employee 是 Person 的子类。
现在,我将以下 XML 配置添加到主机的 App.config 中:
<?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 属性
或者将其添加到已知列表中
类型传递给
数据契约序列化器。'。请参见
有关更多详细信息,请参阅 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 类库)。我只是在宿主项目中对其进行了简单编码。
我猜配置文件一定有问题(请参阅上面的配置文件)。或者我一定错过了什么。任何帮助将非常感激。