с конвенций.
у знать, как настроить известные типы в WCF. Например, у меня естьЧеловек класс иРаботник класс.Работник класс является подклассомЧеловек класс. Оба класса отмечены[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) для своей службы. Я просто закодировал это в принимающем проекте.
Я предполагаю, что должна быть проблема в файле конфигурации (см. Файл конфигурации выше). Или я должен что-то упустить. Любая помощь будет в значительной степени оценена.