Inquiridor
FaultContract - Tratamentos de Erros Silverlight e WCF

Pergunta
-
Bom dia
Tenho visto exemplos com o uso de FaultContract para tratamentos de erros no cliente Silverlight, mas não achei uma solução para o meu problema porque estou trabalhando com camadas.
Na minha solução tenho as camadas de acesso a Dados: Models, Bll e dal, a aplicação Silverlight e o serviço WCF.
Na classe do serviço tenho um metodo assincrono chamado Service_LoadReport. Este metodo chama o metodo do projeto BLL BLL_LoadReport que por sua vez realiza a conexão com o banco de dados no projeto DAL.
Na conexão com o banco de dados (projeto DAL) posso ter um erro de conexão e no metodo BLL_LoadReport (projeto BLL) posso ter outro erro ao preecher um arquivo xml. A dúvida está neste ponto, como estou trabalhando com camadas, como fica a implementação de FaultContract para propagar o erro no cliente usando camadas?
Alguem tem um exemplo para me passar?
Obrigada
Teles
sexta-feira, 9 de março de 2012 13:27
Todas as Respostas
-
Boa noite Teles,
ao meu ver o cliente não precisa e nem deve saber onde e como o erro ocorreu, logo minha sugestão é que você se preocupe em logar com detalhes o erro ocorrido, se possível utilizando um código de erro para rastreá-lo futuramente. Quanto às camadas, sugiro propagar o erro normalmente (throw) até o cliente, contendo o código da mensagem de erro "amigável" que será exibida na interface Silverlight.
Esta sugestão exige um dicionário de mensagens comum entre o serviço e o cliente, o que também acho muito recomendado.
Abraços,
Daniel Cheida de Oliveira
- Sugerido como Resposta Daniel Cheida segunda-feira, 9 de abril de 2012 23:22
- Editado Daniel Cheida segunda-feira, 9 de abril de 2012 23:23
- Não Sugerido como Resposta Daniel Cheida segunda-feira, 9 de abril de 2012 23:23
- Sugerido como Resposta Daniel Cheida segunda-feira, 9 de abril de 2012 23:23
segunda-feira, 9 de abril de 2012 23:21 -
Teles,
Vou te passar um exemplo, mas a praticamente tudo não vai ter alteração no Silverlight. Blz. No senario utilizaremos uma chama qualquer e retornaremos a FaultException no caso de erro. Ok?
O primeiro passo é criar uma classe comum que irá conter as informações da exception. Vai da sua criatividade de como criá-la:
namespace Model { public class SqlCustomException { public SqlCustomException() { } public SqlCustomException(string mensagem) : this() { this.Mensagem = mensagem; } public string Mensagem { get; set; } } }
O segundo é adicionar no serviço que pode acontecer uma FultException daquele tipo. É necessário colocar o atributo na chamada do WCF para o FaultContract e quando der a exception que pode acontecer a exception que deve ser retornada do serviço é uma FaultException do tipo da classe que você criou. Não é necessário que o try fique no serviço. O que vale é o tipo da exception:
namespace ProjetoWcf { [ServiceContract(Namespace = "")] [SilverlightFaultBehavior] [AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] public class MeuServico { [FaultContract(typeof(Model.SqlCustomException))] [OperationContract] public void DoWork() { try { new BLL.ClasseTeste().DoWork(); } catch (Exception ex) { throw new FaultException<Model.SqlCustomException>(new Model.SqlCustomException(ex.Message), "Occorreu um erro inesperado"); } } } }
Espero que tenha ajudado.
Samuel Fabel
- Editado Samuel Fabel sexta-feira, 11 de maio de 2012 18:29
sexta-feira, 11 de maio de 2012 18:28