Lidar com exceções em serviços da web com Elmah
-
24-09-2019 - |
Pergunta
Existe uma maneira de lidar globalmente de exceções no ASP.NET Web Service regular (ASMX) usando o Elmah como fazemos isso no site do ASP.NET?
Solução
Serviços da Web ASP.NET nunca disparam Application_Error
Evento e exceções não podem ser tratados globalmente pela Elmah, como nos aplicativos ASP.NET. Mas podemos "manualmente" registrar exceções usando Elmah:
public int WebServiceMethod() {
try {
...
}
catch (Exception ex) {
Elmah.ErrorLog.GetDefault(
HttpContext.Current).Log(new Elmah.Error(ex, HttpContext.Current));
}
}
Outras dicas
Você pode usar uma sabedoria para fazer isso:
using System;
using System.Web.Services.Protocols;
namespace MyNamespace
{
class ELMAHExtension : SoapExtension
{
public override object GetInitializer(Type serviceType)
{ return null; }
public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute)
{ return null; }
public override void Initialize(object initializer)
{ }
public override void ProcessMessage(SoapMessage message)
{
if (message.Stage == SoapMessageStage.AfterSerialize &&
message.Exception != null)
{
// Log exception here
}
}
}
}
Você registra isso no web.config com as seguintes linhas:
<system.web>
<webServices>
<soapExtensionTypes>
<add type="MyNamespace.ELMAHExtension, MyDLL" priority="1" group="1" />
</soapExtensionTypes>
</webServices>
</system.web>
Isso lhe dará acesso aos objetos HTTPContext e SoapMessage, que devem fornecer todos os detalhes que você precisa sobre o que estava sendo chamado. Eu acho que a exceção que você recupera nesta fase sempre será uma SoapException e que a parte em que você está interessada é provavelmente a exceção interna.
Você pode usar este código
try{
// your code in here
}
catch (Exception ert)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(ert);
}