Dúvidas sobre o uso de SoapException.

173 views
Skip to first unread message

Forum Doubts

unread,
Oct 18, 2012, 9:24:42 PM10/18/12
to dotnetar...@googlegroups.com
Olaa,


               Estou criando um WebServices ASMX e queria em caso de erro retornar uma SoapException. Isso é aconselhado ? E se o sistema que tiver consumindo meu WebServices for um sistema muito antigo, feito em uma tecnologia/linguagem que não dê suporte ao tratamento de exceções e não tenha como capturar no cliente essa SoapException ? Qual a opinião de vocês a respeito ?

De antemão agradecido.

Atenciosamente.

Abner das Dores

unread,
Oct 18, 2012, 9:34:48 PM10/18/12
to dotnetar...@googlegroups.com
Quando se trabalha com WebServices, tudo é XML. A plataforma .Net só facilita nossa vida em alguns aspectos gerando as classes proxy do WSDL. Quando você lançar uma SoapException provavelmente o cara vai receber um xml parecido com esse:

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope
    xmlns
:soap="http://schemas.xmlsoap.org/soap/envelope/"
    xmlns
:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns
:xsd="http://www.w3.org/2001/XMLSchema">
 
<soap:Body>
   
<soap:Fault>
     
<faultcode>soap:Server</faultcode>
      <faultstring>
        System.Web.Services.Protocols.SoapException: Server was unable to process request. ---    &gt; System.DivideByZeroException: Attempted to divide by zero.
        at Service.HelloWorld() in C:\Test\Service.asmx.cs:line 35
        --- End of inner exception stack trace ---
      </
faultstring>
     
<detail />
   
</soap:Fault>
  </
soap:Body>
</soap:Envelope>

Ou seja, mesmo que ele consuma manualmente, sem classes proxy ou algo do tipo, o erro será informado para ele via XML.


--
Você recebeu esta mensagem porque faz parte do grupo .Net Architects hospedado no Google Groups.
Para postar envie uma mensagem para dotnetar...@googlegroups.com
Para sair do grupo envie uma mensagem para dotnetarchitec...@googlegroups.com
Para mais opções visite o grupo em http://groups.google.com/group/dotnetarchitects?hl=pt-br

Forum Doubts

unread,
Oct 18, 2012, 11:04:06 PM10/18/12
to dotnetar...@googlegroups.com
Caro Abner das Dores,

Obrigado pela atenção, 

Mas tem um detalhe  que ainda não está 100 % claro. 

Mesmo que uma aplicação que foi feita em COBOL(Cobol estruturado), que foi feita a 30 anos atras, mesmo que o meu  WebServices lance uma SoapException   essa aplicação em COBOL citada irá conseguir obter essa exceção e utilizar a mesma ?

Atenciosamente.

2012/10/18 Abner das Dores <abner...@gmail.com>

Abner das Dores

unread,
Oct 19, 2012, 6:53:10 AM10/19/12
to dotnetar...@googlegroups.com
Então cara, não faço ideia de como seja feito para consumir Web Services em Cobol, mas posso garantir duas coisas:

1) Não, quem for consumir não vai enxergar a mesma classe SoapException. Pelo simples fato dela ser uma implementação da plataforma .Net.

2) Na pior das hipóteses, independente da plataforma, o cara deve manualmente fazer uma requisição para o ser serviço, passando o XML de requisição que ele montou nó a nó, e sua aplicação vai retornar um XML de resposta (que em caso de erro vai ser parecido com aquele que eu mandei anteriormente), e ele também terá que tratar nó a nó.

Acho que para você entender melhor, eu recomendaria você utilizar o SoapUI para testar ser Web Service: http://www.soapui.org/

O SoapUI faz requisições para WebServices utilizando o XML puro (ele cria os modelos iniciais pra você), e ai você consegue ver a sua resposta também em XML. Acho que fazendo uns testes com o SoapUI fica mais fácil de enxergar como funcionaria seu WS da maneira mais primitiva, independente da plataforma que está consumindo.

Espero ter ajudado.

Att.,

Abner

Alexandre Santos Costa

unread,
Oct 19, 2012, 7:10:35 AM10/19/12
to dotnetar...@googlegroups.com

Amigo,

 

Como o outro amigo disse o que será retornaa a aplicação Cobo será o XML contendo o SOAPEXception, ficará como responsabilidade dequem desenvolver o código da chamada identificar que ó retorno  é um SOAPException e fazer o parsing para extrair o máximo de informação possível para tratar essa exceção.

 

No ambiente que trabalho dificilmente um Coboi chamará um Web Service dadoo  custo do processamento do parsing de XML e para isto, então, além de minha opinião er uma boa práticaja que reduzirão acoplamento, seria criada uma aplicação intermediaria que se comunicaria para o Web Service e retornaria a informação mais mastigada para o Cobol utilizando algum dos mecanismos de comunicação entre a alta e a baixa.

 

Mesmo assim não é nada impossível de se fazer em Cobol e acredito inclusive até mesmo haver boas implementações já disponíveis no mercado.

 

Tenho pra mim que se nos baseamos em padrões e os seguimos corretamente a preocupação  fica  apenas cm o consumidor que deverá também respeitar esses padrões para usar meusserviços.

 

Grato,

 

Alexandre

Rafael Ponte

unread,
Oct 19, 2012, 1:12:09 PM10/19/12
to dotnetar...@googlegroups.com
Olá,

Acho bem dificil algum programador em alguma plataforma/linguagem trabalhar com webservice soap fazendo parsing de xml na mão. A especificação de certa forma foi feita para ser trabalhada com a utilização de ferramentas de geração de código.

Se as plataformas distintas implementam e seguem a especificação corretamente então sim, o SoapException seria entendido por ambas as pontas. Uma das principais features de WS-* (se não a principal) é a interoperabilidade entre várias plataformas. 

2012/10/19 Alexandre Santos Costa <alexandres...@gmail.com>

Carlos Vítor Barros

unread,
Oct 19, 2012, 1:46:32 PM10/19/12
to dotnetar...@googlegroups.com
Se você está criando WebServices ASMX pra falar com COBOL, eu usaria REST com HTTP puro ao invés de SOAP pra falar. É muito mais simples.
Mas caso você já possua ferramentas SOAP com o COBOL, siga em frente e manda ver.

Eu particularmente quando faço a façade de um WebService eu nunca retorno uma SOAP Exception ou exception de qualquer tipo. Geralmente encapsulo o retorno para que haja jeito de verificar se houve sucesso ou falha, e uma mensagem de erro em caso de falha. Dessa maneira, fica muito mais fácil garantir a interoperabilidade.

Abs,

CV

Forum Doubts

unread,
Oct 29, 2012, 6:30:46 PM10/29/12
to dotnetar...@googlegroups.com
Grato pela atenção dada ao post.Minhas dúvidas foram sanadas.

Ronaldo Silva
Estudante de  Sistemas de Informação.

2012/10/19 Carlos Vítor Barros <carlosvi...@gmail.com>
--

Eric Lemes

unread,
Nov 3, 2012, 2:59:30 PM11/3/12
to dotnetar...@googlegroups.com
Forum Doubts,

Pra tentar contribuir:

SOAP é um protocolo padrão de mercado, apesar de existirem diferenças de implementação da especificação que muitas vezes geram problemas de interoperabilidade. Ex.: web services escritos em java que não são consumidos corretamente do .NET e vice-versa. Por essa razão, a linguagem que implementa o padrão SOAP deve saber tratar os erros.

No framework do .NET existe já o tratamento de dar um throw numa exception quando ocorre um erro numa chamada SOAP. Essa é a forma que implementaram a especificação. Nâo significa que é a única possível.

Sobre o COBOL, eu não sou catedrático (conheço muito pouco), mas já te adianto que parsear xml em COBOL é algo próximo de impossível sem um toolkit ou ferramenta específica. Dá pra fazer no modo entender xml como string, mas a chance de dar errado é bem grande.

 Tem que entender ainda que tipo de cobol estamos falando. Batch, CICS, IMS ou outros. Mainframe é uma arquitetura de máquina e de desenvolvimento bastante diferente de baixa plataforma. Desde o charset (em mainframe é EBCDIC e não ASCII) até a forma de pensar é diferente. No mainframe batch é batch e online é online. Nâo dá pra rodar um subprograma batch em mainframe a partir de uma "tela" para o usuário. Batch só roda agendado. Online roda dentro de monitor transacional e dependendo do monitor transacional usado é uma forma diferente de desenvolver.

Eu particularmente desconheço web services em mainframe, principalmente tratando-se de COBOL. Quando executa-se produtos específicos que rodam em mainframe (coisas da IBM, Websphere, Java, etc) acho até possível, mas falando de COBOL especificamente, acho pouco provável que exista algo pronto.

Em geral, interoperabilidade com baixo sofrimento em mainframe dá-se por filas MQ. 

Outra coisa que tem que tomar muito cuidado falando de web services é dessa coisa de "o .NET gera automático". Realmente, ele gera o que é bom em muitos aspectos, mas ruim em outros. Quando falamos de barramentos de serviços (ESB's) em geral utiliza-se uma abordagem "contract first" o que é muito difícil fazer em .NET. Em geral quando precisa-se desenvolver um web service que atenda um WSDL dado por alguém (e não gerado pelo .NET) é sofrimento certo. Não sei se nas novas versões do framework trabalharam nisso. Até a 3.5 adianto que é sofrimento.


Abraço,

Eric




2012/10/29 Forum Doubts <forum...@gmail.com>

Bruno Paiva

unread,
Nov 5, 2012, 6:44:14 AM11/5/12
to dotnetar...@googlegroups.com
Cara, se vc souber quais são os tipos de respostas que o WS vai enviar, dá pra da pra fazer um parser XML numa boa. Não é nada complexo, só é trabalhoso.
Mas se vc for fazer mesmo, pense que só vai ter aquele trabalho uma vez e nunca mais. :-)

Agora respondendo a sua pergunta diretamente, independente de parserXML ou ferramenta de geração de código, eu prefiro criar um TO que teria o status da transação, mensagem de feedback e os outros campos que vc precise retornar. Em caso de muito TO's, faz uma herança dos campos comuns.

Forum Doubts

unread,
Nov 5, 2012, 7:15:50 PM11/5/12
to dotnetar...@googlegroups.com
Grato a todos pela atenção e pela qualidade das respostas. 

Muitas dúvidas foram esclarecidas.

2012/11/5 Bruno Paiva <brunosan...@gmail.com>
--
Reply all
Reply to author
Forward
0 new messages