Я хочу знать, как настроить известные типы в WCF. Например, у меня есть класс Person и класс Employee . Класс Employee является подклассом класса Person . Оба класса отмечены атрибутом [DataContract]
.
Я не хочу жестко кодировать известный тип класса, например помещать [ServiceKnownType(typeof(Employee))]
в класс Person, чтобы 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'
данные договора. Десериализатор не имеет
знание любого типа, который отображается на
этот контракт. Добавить тип
соответствует «Сотрудник» к
список известных типов - например, по
используя атрибут 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) для своей службы. Я просто закодировал это в хост-проекте.
Я полагаю, что проблема в файле конфигурации (см. Файл конфигурации выше). Или я должен что-то упустить. Любая помощь будет очень признательна.