Trabalhando com Fault Message
Hoje vou falar sobre como trabalhar com a Fault Message em uma porta do tipo Request-Response.
Quando usamos um WebService com esse tipo de porta, e acontece um erro, o que acaba sendo retornado para o WebService é uma mensagem de Time out.
Aparece uma Mensagem +/- parecida com essa:
<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>Server was unable to process request. ---> Application Either Has Timed Out Or Is Timing Out</faultstring>
<detail />
</soap:Fault>
</soap:Body>
</soap:Envelope>
O ideal seria que a mensagem fosse retornada com a descrição do erro.
Usando a Fault Message teremos a seguinte mensagem:
<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>An exception is thrown by the Orchestration schedule</faultstring>
<faultactor>http://webserviceaddres/SampleFaultMessage_Proxy/WebService_SampleFaultMessage.asmx</faultactor>
<detail>
<ns0:Erro xmlns:ns0="http://SampleFaultMessage.schema.schErro">
<Descricao>Could not find a part of the path 'C:\folder\xmldoc.xml'.</Descricao>
</ns0:Erro>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
Então mãos a obra:
Criando a Fault Port
- Crie um novo projeto de Biztalk.
- Adicione uma orchestration.
- Adicione um schema com o nome de schEntrada. Deve ter a seguinte estrutura:
- Adicione outro schema com o nome de schErro. Deve conter o seguinte layout:
- Adicione um shape de “Receive”.
- Na orchestration adicione um “Scope”, dentro dele deve conter um shape de “Send”, e um shape de “Message Assignment”, que construirá a mensagem a ser enviada.
- Crie uma porta Lógica do tipo Request-Response, com o Operation público, para podermos publicar a orchestration como WebService.
Segue script do Message Assignment.
xmlDoc.LoadXml("<ns0:Request xmlns:ns0='http://SampleFaultMessage.schema.schEntrada'>"+
"<Recebe>Certo</Recebe> "+
" </ns0:Request>");msgResponse = xmlDoc;
xmlDoc.Save(@"C:\ruth\xmldoc.xml");
OBS: É importante tentar salvar o XML em um local que não existe para forçar o erro
- Clique em Operation com o botão direito da porta criada e clique em “New Fault Message”.
- Crie uma mensagem do tipo schErro.
- Arraste um shape de “Send” no exception do Escopo, e um “Message Assignment” para construir a Mensagem de erro e enviar para a porta Fault.
Segue o Script do “Message Assignment”
xmlDoc.LoadXml("<ns0:Erro xmlns:ns0='http://SampleFaultMessage.schema.schErro'>"+
"<Descricao>"+ex.Message+"</Descricao> "+
"</ns0:Erro>");msgFaultMessage = xmlDoc;
Está feito! Assim quando ocorrer um erro na orchestration, a descrição detalhada será retornada no lugar da porta Response do WebService.
Agora é só fazer o deploy do projeto e publicar a orchestration como Web Service.
O código do exemplo pode ser baixado em: http://faultmessage.codeplex.com/.
Nesse exemplo, existem duas orchestration, uma com Fault Message e outra sem. Também existe o Web Service pronto, assim como o Pacote Msi e os Bindings.
Enjoy!
Seja o primeiro a comentar ;)
Postar um comentário