【发布时间】:2009-02-18 08:10:18
【问题描述】:
我想知道如何在 WCF 中配置已知类型。例如,我有一个 Person 类和一个 Employee 类。 Employee 类是 Person 类的子类。这两个类都标有[DataContract] 属性。
我不想硬编码类的已知类型,例如在 Person 类中放置 [ServiceKnownType(typeof(Employee))],以便 WCF 知道 Employee 是 Person 的子类。
现在,我在主机的 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'数据合同。解串器没有 映射到的任何类型的知识 这份合同。添加类型 对应于 '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 类库)。我只是在宿主项目中对其进行了简单的编码。
我想配置文件肯定有问题(请参阅上面的配置文件)。或者我一定错过了什么。任何帮助将不胜感激。
【问题讨论】:
-
我怀疑配置只有在使用第三方库时才有效,将其引用到服务。我会尝试一下,如果我找到一些答案,我会回到这个问题。
标签: wcf wcf-configuration