Question

Y at-il un moyen de gérer les exceptions globalement dans le service Web ASP.NET régulière (asmx) en utilisant ELMAH comme nous le faisons dans le site Web ASP.NET?

Était-ce utile?

La solution

services Web ASP.NET jamais d'événements Application_Error d'incendie et les exceptions ne peuvent pas être traitées globalement par ELMAH comme dans les applications ASP.NET. Mais nous pouvons "manuellement" log des exceptions en utilisant ELMAH:


public int WebServiceMethod() {
  try {
   ...
  }
  catch (Exception ex) {
    Elmah.ErrorLog.GetDefault(
      HttpContext.Current).Log(new Elmah.Error(ex, HttpContext.Current));
  }
}

Autres conseils

Vous pouvez utiliser un SoapExtension faire ceci:

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
            }
        }
    }
}

Vous enregistrez cela dans le web.config avec les lignes suivantes:

<system.web>
  <webServices>
    <soapExtensionTypes>
      <add type="MyNamespace.ELMAHExtension, MyDLL" priority="1" group="1" />
    </soapExtensionTypes>
  </webServices>
</system.web>

Cela vous donnera accès aux objets HttpContext et SoapMessage qui devrait vous donner tous les détails dont vous avez besoin au sujet de ce qui était appelé. Je pense que l'exception vous extrayez à ce stade sera toujours un SoapException et que le bit qui vous intéresse est probablement l'exception interne.

Vous pouvez utiliser ce code

 try{
// your code in here
}
     catch (Exception ert)
            {
                Elmah.ErrorSignal.FromCurrentContext().Raise(ert);

            }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top