O que poderia causar um serviço WCF para retornar um objeto do tipo “objeto”
-
05-07-2019 - |
Pergunta
Por meu outro post sobre valores de retorno serviço WCF , estou consumindo um serviço web de outra empresa, e quando eu adicionar a referência de serviço dentro do Visual Studio, o valor de retorno do método é um objeto do tipo object
.
O autor do serviço web mostrou-me o código, e ele realmente retorna um objeto digitado.
Estou faltando alguma coisa, ou é a classe de proxy deve retornar um valor digitado?
Existe uma configuração para gerar a classe de proxy ou o serviço real?
UPDATE:
Eu olhei para as classes reais por trás do serviço WCF e percebeu que o valor de retorno do método de serviço é realmente retornando um Interface , que os implementos do tipo concreto. O tipo concreto é marcado com o atributo [DataContract] (e adequadas atributos [DataMember]), mas a interface não tem esses atributos. isso poderia estar causando o serviço para definir o tipo de retorno como um objeto?
Solução
Hipoteticamente, se você fosse o desenvolvedor serviço, você poderia usar um KnownTypeAttribute
:
[DataContract]
[KnownType(typeof(MyConcreteClass))]
public interface IMyInterface {
}
[DataContract]
public class MyConcreteClass : IMyInterface {
}
Eu pessoalmente não tentei isso com uma interface, mas eu tentei com uma classe base abstrata e funciona bem. Quando o cliente recebe o valor de retorno, ele pode com sucesso baixos para a classe derivada.
Pode ser que o código de serviço realmente faz isso, e as mentiras de problema com svcutil.exe
não gerar as classes de proxy com precisão suficiente.
Embora você não controlar o código de serviço, você controlar o código de proxy do cliente. Você poderia tentar editar manualmente as classes de proxy que svcutil.exe
deu-lhe adicionar o KnownTypeAttribute
si mesmo. Ao fazer isso, você está tomando o controle do comportamento do DataContractSerializer no seu fim, e contanto que você tome cuidado para não alterar o formato de fio dos dados por engano, que deveria todos ainda trabalho.
Outras dicas
A classe proxy é um arquivo gerado e, como tal, pode conter erros. Se você tem uma cópia do contrato de dados você está livre para alterar a classe proxy para usar o tipo correto ao invés de System.Object
e as coisas devem funcionar corretamente.
O "Add Service Reference" ferramenta e svcutil.exe
Visual Studio são muito bons em gerar classes de proxy, mas eles não são perfeitos. Os arquivos que eles geram são seus para modificar e gostaria de encorajar você simplesmente modificar a operação para devolver o contrato de dados adequada.
Nós tivemos um problema semelhante ao consumir um serviço de java web do WCF.
No nosso caso, o tipo que ele disse que estava retornando era uma versão limitada do que estava sendo devolvidos.
O que funcionou para nós era converter o objeto para o tipo que era esperado. Depois que os dados estavam disponíveis.
Portanto, para corrigir seu problema, você pode tentar converter o objeto para o tipo esperado.