WCF com objetos compartilhados e classes derivadas no cliente
-
28-09-2019 - |
Pergunta
Eu tenho um serviço WCF e estou compartilhando tipos com um cliente em uma montagem compartilhada. Se o cliente criar uma classe derivada, será possível repassar o tipo derivado para o serviço para que eu possa ler as propriedades adicionadas através da reflexão?
Eu tentei, mas tendo problemas com os types conhecidos, pois o serviço não sabe como desfazer o tipo derivado.
[Serializable]
public abstract class Car : ICar
{........
// no cliente:
[Serializable]
public class MyCar : Car
{......
Ao passar do MyCar para o serviço, recebo a exceção reclamando do KnowType, mas não posso adicionar isso ao servidor, pois não sei o que o cliente enviará e quero lidar com propriedades extras através da reflexão.
Possível registrar tipos de clientes como types conhecidos em tempo de execução?
Talvez seja a solução?http://blogs.msdn.com/b/sowmy/archive/2006/03/26/561188.aspx
Solução
Isso não é possível. Tanto o serviço quanto o cliente precisam saber quais tipos serão enviados em mensagens. Se você deseja usar o tipo conhecido, deve definir essa relação com o tipo pai no serviço.
Por que você precisa conhecer propriedades adicionais no servidor?
Outras dicas
Eu acho que existe um caminho.
Lembro -me vagamente que, quando estudei o WCF, conheci o ExtensionData, que deveria ser um mecanismo para obter tudo o que não corresponde à serialização da classe. por exemplo, se você ativar a extensão e está nesta situação
//Server
public class GenericRQ
{
public string GenericProperty {get;set;}
}
public Service GenericService
{
Public void GenericMethod(GenericRQ RQ)
{
}
}
// client
Public class MoreSpecificRQ : GenericRQ
{
public string SpecificProperty {get;set;}
}
No
Public void GenericMethod(GenericRQ RQ)
{
// the serializer adds automatically in RQ.ExtensionData everything that has come and that does not match the class GenericRQ.
}
Sobre como ativar a extensão que você procura facilmente na web