none
FaultContract - Tratamentos de Erros Silverlight e WCF RRS feed

  • 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