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

  1. Crie um novo projeto de Biztalk.
  2. Adicione uma orchestration.
  3. Adicione um schema com o nome de schEntrada. Deve ter a seguinte estrutura:

    image

  4. Adicione outro schema com o nome de schErro. Deve conter o seguinte layout:

    image

  5. Adicione um shape de “Receive”.
  6. 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.
  7. Crie uma porta Lógica do tipo Request-Response, com o Operation público, para podermos publicar a orchestration como WebService.

     image

    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

  8. Clique em Operation com o botão direito da porta criada e clique em “New Fault Message”.

           image

  9. Crie uma mensagem do tipo schErro.
  10. 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.

          image

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

BizTalk 360

Visitas

Arquivo do blog