WCF: Configurando tipos conhecidos
Quero saber como configurar tipos conhecidos no WCF. Por exemplo, eu tenho umPesso classe e umEmpregad classe. OEmpregad class é um sublass doPesso classe. Ambas as classes são marcadas com um[DataContract]
attribute.
Eu não quero codificar o tipo conhecido de uma classe, como colocar um[ServiceKnownType(typeof(Employee))]
na classe Person para que o WCF saiba que Employee é uma subclasse de Perso
gora, adicionei ao App.config do host a seguinte configuração 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>
Eu compilei, executei o host, adicionei uma referência de serviço ao cliente e adicionei algum código e execute o cliente. Ocorreu um erro:
O formatador lançou uma exceção ao tentar desserializar a mensagem: Ocorreu um erro ao tentar desserializar o parâmetrohttp://www.herbertsabanal.net:person
. A mensagem InnerException era 'Erro na linha 1, posição 247. Elemento'http://www.herbertsabanal.net:person'
contém dados do'http://www.herbertsabanal.net/Data:Employee'
contrato de dados. O desserializador não tem conhecimento de nenhum tipo que seja mapeado para este contrato. Adicione o tipo correspondente a 'Employee' à lista de tipos conhecidos - por exemplo, usando o atributo KnownTypeAttribute ou adicionando-o à lista de tipos conhecidos transmitidos ao DataContractSerializer. '. Consulte InnerException para mais detalhes.
Abaixo estão os contratos de dados:
[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; }
}
}
Aliás, eu não usei bibliotecas de classes (bibliotecas de classes WCF ou bibliotecas de classes não-WCF) para o meu serviço. Eu simplesmente o codifiquei no projeto hos
Acho que deve haver um problema no arquivo de configuração (consulte o arquivo de configuração acima). Ou devo estar faltando alguma coisa. Qualquer ajuda seria muito bem-vinda.