Inquiridor
Retorno de mensagens - SoapException

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)
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 Snippetpublic
static class ExceptionExtensions {message = message.Remove(0, message.LastIndexOf(
"--->"));message = message.Remove(0, message.IndexOf(
":") + 1); if (message.IndexOf('\n') >= 0) {message = message.Remove(message.IndexOf(
}
}
else {}
}
}
ficaria assim seu codigo
Code Snippetpublic static void Exclui(TOEntidade toEntidade){try{_service.Exclui(toEntidade);}catch (SoapException ex){ex.Raise();}} -
-
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....
-
Pra simplificar .. seria isso aqui
Code Snippetpublic 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);
}} -
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,
-