سؤال

هل هناك طريقة للتعامل مع الاستثناءات العالمية في خدمة الويب العادية ASP.NET (ASMX) باستخدام Elmah مثلنا نفعل ذلك في موقع ASP.NET على الويب؟

هل كانت مفيدة؟

المحلول

خدمات الويب ASP.NET لا تطلق النار أبدًا Application_Error لا يمكن التعامل مع الحدث والاستثناءات على مستوى العالم كما هو الحال في تطبيقات ASP.NET. ولكن يمكننا "يدويًا" استثناءات تسجيل الدخول باستخدام Elmah:


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

نصائح أخرى

يمكنك استخدام الصابون للقيام بذلك:

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

يمكنك تسجيل هذا في web.config مع الأسطر التالية:

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

سيمنحك هذا الوصول إلى كائنات HTTPContext و SOAPMessage التي يجب أن تمنحك جميع التفاصيل التي تحتاجها حول ما تم استدعاؤه. أعتقد أن الاستثناء الذي تسترجعه في هذه المرحلة سيكون دائمًا بمثابة صابون وأن الشيء الذي تهتم به ربما يكون الاستثناء الداخلي.

يمكنك استخدام هذا الرمز

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

            }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top