Pergunta

Eu estou tentando escrever um serviço web para especificação e que exige um corpo de resposta diferente, dependendo se o método for concluído com êxito ou não. Eu tentei criar duas classes DataContract diferentes, mas como eu posso devolvê-los e tê-los serializado corretamente?

Foi útil?

Solução

A resposta é Sim , mas é complicado e você perde tipagem forte em sua interface. Se você retornar um fluxo, em seguida, os dados poderiam ser xml, texto, ou mesmo uma imagem binário. Para as classes DataContract, você iria em seguida, serializar os dados usando o DataContractSerializer .

Veja a BlogSvc e mais especificamente a RestAtomPubService.cs serviço WCF para mais detalhes. Note, que o código fonte também irá mostrar-lhe como aceitar diferentes tipos de dados em um método resto WCF que requer um tipo de mapeador de conteúdo.

Outras dicas

A melhor maneira de indicar que o serviço web WCF falhou seria jogar uma FaultException. Há configurações em seus arquivos web.config de serviços que permitem que toda a mensagem de falha a ser passado para o cliente como parte do erro.

Outra abordagem pode ser para herdar ambos os resultados da mesma classe base ou interface. O serviço iria retornar uma instância do tipo base. então você pode usar o atributo KnownType para informar o cliente que vários tipos podem ser devolvidos. Venha para pensar sobre isso, talvez seja possível usar objeto como o tipo de base, mas eu não tentei.

Na falta de qualquer uma dessas abordagens, você pode criar um objeto de resultado personalizado que contém um resultado e propriedades de erro e seu cliente pode então decidir qual curso de ação a tomar. Eu tive que usar essa abordagem para o Silverlight 2, porque Beta 2 ainda não suporta integralmente os contratos de falha. Não é bonito, eu normalmente não recomendo, mas se é a única maneira que as obras ou você sente que é a melhor abordagem para a sua situação ...

Se você está tendo problemas com ADO.NET Data Services, tenho menos experiência lá.

Aqui estão algumas informações na implementação FaultContracts

Se você estiver usando um xml com base de ligação, então eu acredito que não há nenhuma maneira de fazer isso. Uma solução simples, nesse caso, seria apenas para ter parte da bandeira mensagem se houve uma falha, e armazenar a algum lugar informação de falha, se necessário. Para um JSON ligação você pode ser capaz de usar um método que retorna um objeto, em seguida, retornar dois tipos diferentes de objetos. Se bem me lembro (o que é raro), isto é possível porque a classe JavaScriptSerializer usa reflexão se o objeto é limpo de atributos de serialização.

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