eccezioni di handle nei servizi web con Elmah
-
24-09-2019 - |
Domanda
C'è un modo per gestire le eccezioni globalmente in Web Service regolare ASP.NET (asmx) utilizzando ELMAH come lo facciamo in sito web ASP.NET?
Soluzione
servizi Web ASP.NET mai evento Application_Error
fuoco e le eccezioni non possono essere gestite a livello globale da ELMAH come in applicazioni ASP.NET. Ma siamo in grado di "manualmente" log eccezioni utilizzando ELMAH:
public int WebServiceMethod() {
try {
...
}
catch (Exception ex) {
Elmah.ErrorLog.GetDefault(
HttpContext.Current).Log(new Elmah.Error(ex, HttpContext.Current));
}
}
Altri suggerimenti
È possibile utilizzare un SoapExtension per fare questo:
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
}
}
}
}
Si registra questo nel web.config con le seguenti righe:
<system.web>
<webServices>
<soapExtensionTypes>
<add type="MyNamespace.ELMAHExtension, MyDLL" priority="1" group="1" />
</soapExtensionTypes>
</webServices>
</system.web>
Questo vi darà accesso ai HttpContext e SOAPMessage oggetti che dovrebbero garantire tutti i dettagli necessari su ciò che è stato chiamato. Credo che l'eccezione si recupera in questa fase sarà sempre un SoapException e che il bit che ti interessa è probabilmente l'eccezione interna.
È possibile utilizzare questo codice
try{
// your code in here
}
catch (Exception ert)
{
Elmah.ErrorSignal.FromCurrentContext().Raise(ert);
}