2010-05-21 8 views
6

में कस्टम त्रुटि पृष्ठ पर ELMAH लॉग आईडी गुजर रहा एक ASP.NET वेबफ़ॉर्म आवेदन में अपवाद बिना क्रिया लॉग इन करने के ELMAH उपयोग कर रहा हूँ। लॉगिंग ठीक काम कर रहा है।समस्या ASP.NET

मैं एक परिष्कृत त्रुटि पृष्ठ है कि उपयोगकर्ता त्रुटि के बारे में एक प्रशासक ईमेल करने की क्षमता दे देंगे करने के लिए ELMAH त्रुटि लॉग आईडी पास करना चाहते हैं। मैंने this answer से सलाह का पालन किया है। कस्टम त्रुटि पेज, सत्र चर संदर्भ पर

void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args) 
{   
    Session[StateKeys.ElmahLogId] = args.Entry.Id; 

    // this doesn't work either: 
    // HttpContext.Current.Items[StateKeys.ElmahLogId] = args.Entry.Id; 
} 

लेकिन, और HttpContext.Current.Items मुझे एक NullReference अपवाद दे रहे हैं: यहाँ मेरी global.asax कोड है। मैं अपने कस्टम त्रुटि पृष्ठ पर आईडी कैसे पास कर सकता हूं?

उत्तर

7

यह मेरे लिए काम करता है:

void ErrorLog_Logged(object sender, ErrorLoggedEventArgs args) 
{ 
    if (args.Entry.Error.Exception is HandledElmahException) 
     return; 

    var config = WebConfigurationManager.OpenWebConfiguration("~"); 
    var customErrorsSection = (CustomErrorsSection)config.GetSection("system.web/customErrors");   

    if (customErrorsSection != null) 
    { 
     switch (customErrorsSection.Mode) 
     { 
      case CustomErrorsMode.Off: 
       break; 
      case CustomErrorsMode.On: 
       FriendlyErrorTransfer(args.Entry.Id, customErrorsSection.DefaultRedirect); 
       break; 
      case CustomErrorsMode.RemoteOnly: 
       if (!HttpContext.Current.Request.IsLocal) 
        FriendlyErrorTransfer(args.Entry.Id, customErrorsSection.DefaultRedirect); 
       break; 
      default: 
       break; 
     } 
    }   
} 

void FriendlyErrorTransfer(string emlahId, string url) 
{ 
    Server.Transfer(String.Format("{0}?id={1}", url, Server.UrlEncode(emlahId))); 
} 
+2

जहां 'हैंडलएल्माएक्सप्शन' आपके उत्तर में वर्णित एक कस्टम क्लास है [यहां] (http://stackoverflow.com/a/2906221/39396) –

+4

क्या आपको कभी "बाल अनुरोध निष्पादित करने में त्रुटि ..." 'Server.Transfer'? –

2

रोनी के समाधान पर टिप्पणी करने में असमर्थ। मैं था कि थोड़ी देर के लिए जगह में, लेकिन यह मानक त्रुटि प्रवाह प्रक्रिया टूट जाता है और हमेशा हस्तांतरण करने के लिए ErrorLog_Logged का कारण बनता है, तब भी जब

Elmah.ErrorSignal.FromCurrentContext().Raise(ex);

यह एक समस्या है बुला अगर आप अभी भी एक के भीतर से एक त्रुटि प्रवेश करना चाहते हैं कैप्चर स्टेटमेंट, उदाहरण के लिए आपके पास एक त्रुटि के लिए वर्कअराउंड है लेकिन उचित फिक्स करने के लिए त्रुटि लॉग करना चाहते हैं, जो मुद्दों को दोहराने में मुश्किल हो सकती है।

मैं निम्नलिखित परिवर्तन उपयोग करके इसे ठीक करने में सक्षम था:

//if (customErrorsSection != null)  
if (customErrorsSection != null && this.Context.Error != null) 

यह ठीक से निपटने ठेठ त्रुटि का सम्मान करता है, के रूप में context.Error मामलों में जहां आप स्पष्ट रूप Elmah में अपवाद जुटाने में अशक्त हो जाएगा, लेकिन डिफ़ॉल्ट त्रुटि हैंडलिंग के माध्यम से गिरते समय शून्य नहीं है (पकड़ के माध्यम से नहीं या पकड़ा गया और फिर से फेंक दिया गया)। यह रोनी के समाधान को नेट त्रुटि प्रबंधन तर्क के समान प्रतिक्रिया देने का कारण बनता है।

+0

मैंने थोड़ी देर पहले एल्मा का उपयोग करना बंद कर दिया था। अपनी त्रुटियों को स्वयं लॉग करना आसान है। –

+0

हाँ, मुझे नहीं पता कि मैं फिर से एल्मा रोड पर जाऊंगा या नहीं। यह आसान है क्योंकि यह बहुत सारे काम के बिना अच्छी प्रस्तुति या स्टैक ट्रेस करता है, लेकिन यह आमतौर पर मुझे इसे विस्तारित करना चाहता है, डेटा संरचना और अन्य चीजों को बदलता है जो आमतौर पर इसके साथ जुड़े प्रयासों के लायक नहीं होते हैं। – user2701750

+0

स्टैक ट्रेस प्राप्त करना वास्तव में अपवाद को कॉल करने से ज्यादा आसान नहीं होता है। टॉस्ट्रिंग() ... अपवाद प्रकार, संदेश, और कॉल स्टैक शामिल करता है और इनर्स के माध्यम से रिकर्स करता है। –