2010-02-01 11 views
33

के साथ वेब सेवाओं में अपवादों को संभालें क्या ईएमएमएएच का उपयोग करते हुए नियमित एएसपी.नेट वेब सेवा (एएसएमएक्स) में अपवादों को वैश्विक रूप से संभालने का कोई तरीका है जैसे हम इसे एएसपी.नेट वेबसाइट पर करते हैं?एल्मा

उत्तर

23

एएसपी.नेट वेब सेवाएं कभी भी Application_Error घटना को आग नहीं देतीं और एएसपी.NET ऐप्स जैसे ELMAH द्वारा अपवादों को वैश्विक रूप से संभाला नहीं जा सकता है। लेकिन हम "मैन्युअल" अपवाद ELMAH का उपयोग कर लॉग ऑन कर सकते हैं:

 

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

मैं क्या सोचा था, लेकिन अगर वहाँ था "स्वच्छ" समाधान मैं जाँच की गई थी कि उपयोग कर सकते हैं। धन्यवाद –

+0

हाँ, क्लीनर समाधान या अभ्यास भी मेरे लिए दिलचस्प होगा। और यह अच्छा सवाल है (+1)। –

+0

मैंने अंततः आपके समाधान का उपयोग किया, मुझे इसे करने का बेहतर तरीका नहीं मिला। संकेत के लिए धन्यवाद। –

23

आप एक SoapExtension उपयोग कर सकते हैं करने के लिए इस:

:

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 ऑब्जेक्ट तक पहुंच प्रदान करेगा जो आपको जो भी कहा जा रहा था, उसके बारे में आपको आवश्यक सभी विवरण देना चाहिए। मुझे लगता है कि इस चरण में आपके द्वारा प्राप्त अपवाद हमेशा एक साबुन अपवाद होगा और जिस चीज में आप रुचि रखते हैं वह शायद आंतरिक अपवाद है।

+0

धन्यवाद, मैं इसे आज़माउंगा। –

+1

हैवेन्ट को अभी तक यह करने का मौका मिला है, लेकिन यह _looks_ जैसा काम करना चाहिए। जहां यह कहता है 'कोड अपवाद यहां' कोड 'Elmah.ErrorLog.GetDefault ( HttpContext.Current) .ॉग (नया Elmah.Error (उदा, HttpContext.Current)); 'चाल चल सकता है। – codeulike

+0

यह वास्तव में काम करता है। – avesse

0

आप इस कोड

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

      } 
संबंधित मुद्दे