none
Retorno de mensagens - SoapException RRS feed

  • Pergunta

  • Bom dia.

    Eu trabalho em um sistema com tecnologia WPF que faz comunicação com web services. Uma vez que o WPF trabalha a camada de apresentação no desktop do usuário, os web services são utilizados para se comunicar com as outras camadas (ESB, Business e DAO). 

    Na camada do Desktop é chamado um método de um web service, que executa o código abaixo (o código abaixo é o método do web Service) :

            public void Exclui(TOEntidade toEntidade)
            {
                try
                {
                    ICadastro _cadastro = Cadastro.GetInstance(TipoEntidade.Entidade1);
                    _cadastro.Excluir(toEntidade);
                }
                catch (RetornaMensagem ExTrat)
                {
                    throw TrataExcecao.TratarExcecao("Excluir", "http://Web.Services.Configuracao", ExTrat.BusinessMessage,
                    ExTrat.Source,FaultCode.Server);
                }
            }

    A exceção ExTrat irá retornar uma mensagem gravada em banco de dados. Essa mensagem deve ser retornada ao usuário como uma mensagem associada à regra de negócio que gerou a exception. Porém, ao retornar à camada anterior (desktop do usuário) a mensagem que retorna é outra, seria "Server was unable to process request, ---> Unable to find assembly 'Entidade', version=1.0.0.0, Culture=neutral, PublicKeyToken=<etc>". Segue abaixo o código que exibiu essa mensagem (código contido na camada do desktop do usuário) :

    public static void Exclui(TOEntidade toEntidade)
            {
                try
                {
                    _service.Exclui(toEntidade);
                }
                catch (SoapException ex)
                {
                    throw ex;
                }
            }


    O erro ocorrido não é problema, deveria ter acontecido mesmo de acordo com a regra estabelecida, mas a mensagem exibida ao usuário está errada.. deveria ter retornado a mensagem que veio na exception do web service, ExTrat, e no entando retornou a mensagem retornada na camada do Desktop.

    Assim, a dúvida é : Como eu faço para retornar corretamente a mensagem que foi gerada no Web Service, para a camada anterior ?

    Antecipadamente agradeço, e bom dia.
    • Movido Adriel CodecoModerator sábado, 30 de outubro de 2010 20:00 (De:Windows Presentation Foundation - WPF)
    segunda-feira, 12 de janeiro de 2009 13:40

Todas as Respostas

  •  

    Oi eu uso normalmente um metodo de extensao para isso... mas qq coisa eh so tirar o "this" em "this Exception ex" que funciona tmb como um metodo Estatico normal....

     

    Code Snippet

    public static class ExceptionExtensions {

    public static void Raise(this Exception ex) {

    if (ex is SoapException) {

    var message = ex.Message;

    message = message.Remove(0, message.LastIndexOf("--->"));

    message = message.Remove(0, message.IndexOf(":") + 1);

    if (message.IndexOf('\n') >= 0) {

    message = message.Remove(message.IndexOf('\n'));

    }

    MessageBox.Show(message, "Erro", MessageBoxButton.OK, MessageBoxImage.Error);

    } else {

    MessageBox.Show(ex.Message, "Erro", MessageBoxButton.OK, MessageBoxImage.Error);

    }

    }

    }

     

    ficaria assim seu codigo

     

    Code Snippet
    public static void Exclui(TOEntidade toEntidade)
            {
                try
                {
                    _service.Exclui(toEntidade);
                }
                catch (SoapException ex)
                {
                   ex.Raise();
                }
            }

     

     

    segunda-feira, 12 de janeiro de 2009 18:26
    Moderador
  • Olá, bom dia. Tudo bem ?

    Não entendi, exatamente.... essa classe que você criou, ficaria em qual camada ? No Web Service ou na camada anterior, que chama o Web Service ? 

    Obrigado,
    terça-feira, 13 de janeiro de 2009 10:47
  • Eh que eu uso esse metodos em todos os meus projetos... entao criei uma DLL so para ele...

     

    mas vc pode colocar no aplicativo q vai consumir o seu WebService

     

    a ideia eh a seguinte... toda mensagem SoapException retorna da seguinte forma ao seu aplicativos

     

    "NameSpace.do.Assembly.do.Service ---> Tipo.da.Excessao: Mensagem de erro\r\n

    trace da excessao"

     

    o que esse metodo faz eh verificar se a excessao eh SoapException ou nao.... se for uma excessao normal... apenas mostra uma MessageBox com o erro... se for SoapException eu pego so a mensagem que quero no meio dessa string.... pq sei de depois do ---> vai ter um : separando o tipo da excessao da mensagem

    e a mesma continua ate achar uma quebra de linha....

     

    faço o tratamento da string e mostro a mensagem....

    terça-feira, 13 de janeiro de 2009 12:41
    Moderador
  • Pra simplificar .. seria isso aqui

     

    Code Snippet
    public static void Exclui(TOEntidade toEntidade)
            {
                try
                {
                    _service.Exclui(toEntidade);
                }
                catch (SoapException ex)
                {
              var message = ex.Message;

    message = message.Remove(0, message.LastIndexOf("--->"));

    message = message.Remove(0, message.IndexOf(":") + 1);

    if (message.IndexOf('\n') >= 0) {

    message = message.Remove(message.IndexOf('\n'));

    }

    throw new Exception(message);

                }
            }

     

     

     

    terça-feira, 13 de janeiro de 2009 12:45
    Moderador
  • Olá, bom dia.

    Então, quanto a isso eu entendi... tipo, ficou claro.

    Mas o problema, no caso, continua. Com esse tratamento feito se consegue pegar a mensagem sem os adicionais que o Exception traz, mas o problema é que a mensagem que está sendo retornada não é a mensagem que tem de ser exibida.

    Seria assim : No Web Service eu busco uma mensagem de negócio, quando ocorre a exception. Essa mensagem de negócio tem de ser retornada na camada anterior, camada essa que consome o Web Service.

    Porém, quando retorna à camada que consome o Web Service, retorna a mensagem ""Server was unable to process request, ---> Unable to find assembly 'Entidade', version=1.0.0.0, Culture=neutral, PublicKeyToken=<etc>"" quando deveria retornar uma outra mensagem do tipo "Esse registro não pode ser excluido por motivo tal".

    Dessa forma, como eu faço para retornar a mensagem gerada no Web Service para a camada anterior ?

    Obrigado,
    quarta-feira, 14 de janeiro de 2009 10:50
  • mas isso parece ser pq o seu metodo de Tratar erro ta dando pau não é ?

     

     

    quarta-feira, 14 de janeiro de 2009 12:23
    Moderador