Implementando SOAP Exception na Orchestration
segunda-feira, 2 de agosto de 2010
|
|
Quando trabalhamos com o “SOAP Adapter” ou o “HTTP Adapter”, sendo a Send Port do tipo Request-Response, é uma boa prática a orchestration ser capaz de capturar a descrição dos erros que podem ocorrer nessa chamada.
Quem nunca se deparou com a famosa mensagem de erro: “Error 500 - Internal Server Error” ?
Este artigo pode ser usado tanto com o “SOAP Adapter” quanto com o “HTTP Adapter”, pois os dois acionam o mesmo tipo de exception, o “SOAPException”.
Então Mãos a Obra. Neste artigo iremos trabalhar com o HTTP Adapter.
O desenho final da orchestration deve ficar assim:
Não se esqueça de acrescentar um Nome para aplicação e uma snk.
Compile e faça o deploy do projeto.
Agora precisamos de um site HTTP para testarmos a solução, que está disponivel aqui, bem como o projeto em VS 2008.
A mensagem capturada no exception, deve ser parecida com essa:
É, vai retornar uma mensagem gigante. :)
Note que no campo “ErrorDescription” mostra o erro genérico “O servidor remoto retornou um erro: (500) Erro Interno do Servidor.”
Porem no campo “Body” ele retorna outro xml estruturado que contem a descrição real do erro: “Não foi possível localizar uma parte do caminho 'C:\PastaInexistente\xmlDoc.xml'”
O que quer dizer que o servidor tentou gravar alguma coisa em uma pasta que não existe.
Então é isso. Até a próxima!
Quem nunca se deparou com a famosa mensagem de erro: “Error 500 - Internal Server Error” ?
Este artigo pode ser usado tanto com o “SOAP Adapter” quanto com o “HTTP Adapter”, pois os dois acionam o mesmo tipo de exception, o “SOAPException”.
Então Mãos a Obra. Neste artigo iremos trabalhar com o HTTP Adapter.
Criando o Projeto
Pra começar a brincadeira, vamos adicionar a classe System.Web.Services ao projeto.- Crie um novo projeto.
- Clique em “Add Reference”.
- Na aba “.NET” e procure a classe System.Web.Services e clique em OK.
- Adicione um novo schema, apenas com alguns campos.
- Adicione uma orchestration e adicione os seguintes shapes e portas:
Configurando o Exception
- Na propriedade “Exception Object Type” do Catch Exception clique na seta e escolha “.NET Exceptions”.
- Procure por SoapException, e clique em OK. Deverá aparecer System.Web.Services.Protocols.SoapException.
- Na Propriedade “Exception Object Name”, escolha um nome para o objeto. Nesse exemplo vamos usar “ex”.
- Adicione uma variável e uma mensagem do tipo System.Xml.XmlDocument para recuperar a mensagem de erro.
- Adicione um shape de “Message Assignment“ e o código abaixo:
xmlRetStatus.LoadXml(ex.Detail.InnerXml); msgFaultMessage = xmlRetStatus;
Não se esqueça de acrescentar um Nome para aplicação e uma snk.
Compile e faça o deploy do projeto.
Agora precisamos de um site HTTP para testarmos a solução, que está disponivel aqui, bem como o projeto em VS 2008.
A mensagem capturada no exception, deve ser parecida com essa:
<ns0:NACK Type="NACK" xmlns:ns0="http://schema.microsoft.com/BizTalk/2003/NACKMessage.xsd"> <NAckID>{D7FA5048-9E1F-4566-9C1C-55884FD7B278}</NAckID> <ErrorCode>0xc0c0167a</ErrorCode> <ErrorCategory>0</ErrorCategory> <ErrorDescription>O servidor remoto retornou um erro: (500) Erro Interno do Servidor.</ErrorDescription> <ErrorDetail> <HttpErrorDetail xmlns="http://schema.microsoft.com/BizTalk/2004/HttpErrorDetails.xsd"> <Headers>Connection: Close Content-Length: 6317 Cache-Control: private Content-Type: text/html; charset=utf-8 Date: Fri, 23 Jul 2010 17:04:21 GMT Server: ASP.NET Development Server/9.0.0.0 X-AspNet-Version: 2.0.50727 </Headers> <Body><html> <head> <title>N&#227;o foi poss&#237;vel localizar uma parte do caminho 'C:\PastaInexistente\xmlDoc.xml'.</title> <style> body {font-family:"Verdana";font-weight:normal;font-size: .7em;color:black;} p {font-family:"Verdana";font-weight:normal;color:black;margin-top: -5px} b {font-family:"Verdana";font-weight:bold;color:black;margin-top: -5px} H1 { font-family:"Verdana";font-weight:normal;font-size:18pt;color:red } H2 { font-family:"Verdana";font-weight:normal;font-size:14pt;color:maroon } pre {font-family:"Lucida Console";font-size: .9em} .marker {font-weight: bold; color: black;text-decoration: none;} .version {color: gray;} .error {margin-bottom: 10px;} .expandable { text-decoration:underline; font-weight:bold; color:navy; cursor:hand; } </style> </head> <body bgcolor="white"> <span><H1>Erro de Servidor no Aplicativo '/SitePostXml'.<hr width=100% size=1 color=silver></H1> <h2> <i>N&#227;o foi poss&#237;vel localizar uma parte do caminho 'C:\PastaInexistente\xmlDoc.xml'.</i> </h2></span> <font face="Arial, Helvetica, Geneva, SunSans-Regular, sans-serif "> <b> Descrição: </b>Ocorreu uma exceção não tratada durante a execução da atual solicitação da Web. Examine o rastreamento de pilha para obter mais informações sobre o erro e onde foi originado no código. <br><br> <b> Detalhes da Exceção: </b>System.IO.DirectoryNotFoundException: N&#227;o foi poss&#237;vel localizar uma parte do caminho 'C:\PastaInexistente\xmlDoc.xml'.<br><br> <b>Erro de Origem:</b> <br><br> <table width=100% bgcolor="#ffffcc"> <tr> <td> <code><pre> Linha 20: XmlDocument xmlDoc = new XmlDocument(); Linha 21: xmlDoc.LoadXml(xmlData); <font color=red>Linha 22: xmlDoc.Save(@&quot;C:\PastaInexistente\xmlDoc.xml&quot;); </font>Linha 23: Linha 24: </pre></code> </td> </tr> </table> <br> <b> Arquivo de Origem: </b> c:\ruth\Projetos\BIZTALK_PROJETOS\SitePostXml\Default.aspx.cs<b> &nbsp;&nbsp; Linha: </b> 22 <br><br> <b>Rastreamento de Pilha:</b> <br><br> <table width=100% bgcolor="#ffffcc"> <tr> <td> <code><pre> [DirectoryNotFoundException: N&#227;o foi poss&#237;vel localizar uma parte do caminho 'C:\PastaInexistente\xmlDoc.xml'.] System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) +193 System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) +1162 System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) +66 System.Xml.XmlTextWriter..ctor(String filename, Encoding encoding) +37 System.Xml.XmlDocument.Save(String filename) +77 _Default.Page_Load(Object sender, EventArgs e) in c:\ruth\Projetos\BIZTALK_PROJETOS\SitePostXml\Default.aspx.cs:22 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) +14 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) +35 System.Web.UI.Control.OnLoad(EventArgs e) +99 System.Web.UI.Control.LoadRecursive() +50 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) +627 </pre></code> </td> </tr> </table> <br> <hr width=100% size=1 color=silver> <b>Informações sobre a Versão:</b>&nbsp;Microsoft .NET Framework Versão:2.0.50727.4927; Versão do ASP.NET:2.0.50727.4927 </font> </body> </html> <!-- [DirectoryNotFoundException]: N&#227;o foi poss&#237;vel localizar uma parte do caminho 'C:\PastaInexistente\xmlDoc.xml'. em System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath) em System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy) em System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share) em System.Xml.XmlTextWriter..ctor(String filename, Encoding encoding) em System.Xml.XmlDocument.Save(String filename) em _Default.Page_Load(Object sender, EventArgs e) na c:\ruth\Projetos\BIZTALK_PROJETOS\SitePostXml\Default.aspx.cs:linha 22 em System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e) em System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e) em System.Web.UI.Control.OnLoad(EventArgs e) em System.Web.UI.Control.LoadRecursive() em System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) [HttpUnhandledException]: Exce&#231;&#227;o do tipo 'System.Web.HttpUnhandledException' foi acionada. em System.Web.UI.Page.HandleError(Exception e) em System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) em System.Web.UI.Page.ProcessRequest(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) em System.Web.UI.Page.ProcessRequest() em System.Web.UI.Page.ProcessRequestWithNoAssert(HttpContext context) em System.Web.UI.Page.ProcessRequest(HttpContext context) em ASP.default_aspx.ProcessRequest(HttpContext context) na c:\Windows\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\sitepostxml\dbb57a48\a921aed0\App_Web_c14kkcwh.0.cs:linha 0 em System.Web.HttpApplication.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() em System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) --></Body> </HttpErrorDetail> </ErrorDetail> </ns0:NACK>
É, vai retornar uma mensagem gigante. :)
Note que no campo “ErrorDescription” mostra o erro genérico “O servidor remoto retornou um erro: (500) Erro Interno do Servidor.”
Porem no campo “Body” ele retorna outro xml estruturado que contem a descrição real do erro: “N&#227;o foi poss&#237;vel localizar uma parte do caminho 'C:\PastaInexistente\xmlDoc.xml'”
O que quer dizer que o servidor tentou gravar alguma coisa em uma pasta que não existe.
Então é isso. Até a próxima!
Seja o primeiro a comentar ;)
Postar um comentário