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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top