2009-07-14 6 views
5

क्या सोच रहा था कि आपने इस समाधान के बारे में क्या सोचा था, अगर यह कस्टम पेज पर त्रुटि संदेश पास करने का सही तरीका है?कस्टम त्रुटि को पुनर्निर्देशित करने के लिए अंतिम त्रुटि को पारित करने का सबसे अच्छा तरीका?

web.config में:

<customErrors mode="On" defaultRedirect="~/Error.aspx"></customErrors> 

Global.asax में:

<script RunAt="server"> 
    void Application_Error(object sender, EventArgs e) 
    { 
    Exception ex = Server.GetLastError(); 
    if (ex != null && Session != null) 
    { 
     ex.Data.Add("ErrorTime", DateTime.Now); 
     ex.Data.Add("ErrorSession", Session.SessionID); 
     HttpContext.Current.Cache["LastError"] = ex; 
    } 
    } 

</script> 

मेरी Error.aspx.cs में:

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack) return; 

    if (HttpContext.Current.Cache["LastError"] != null) 
    { 
     Exception ex = (Exception)HttpContext.Current.Cache["LastError"]; 
     if (ex.Data["ErrorTime"] != null && ex.Data["ErrorSession"] != null) 
      if ((DateTime)ex.Data["ErrorTime"] > DateTime.Now.AddSeconds(-30d) && ex.Data["ErrorSession"].ToString() == Session.SessionID) 
       Label1.Text = ex.InnerException.Message; 
    } 
} 
मुद्दे के

: मुझे नहीं पता एक सर्वर करना चाहते हैं। Global.asax से ट्रांसफर करें .. मुझे नहीं पता। मेरे लिए बेकार लग रहा है। केवल रिमोट करने के लिए customErrors बदलने में सक्षम होना चाहते हैं। इसलिए कहीं भी अंतिम अपवाद को सहेजना है, लेकिन सत्र नहीं हो सकता है, इसलिए कैश में सहेजें लेकिन कुछ अतिरिक्त डेटा (समय और सत्र आईडी) के साथ कैश वैश्विक है और यह सुनिश्चित करना चाहता है कि किसी को गलत त्रुटि न दिखाई दे।


मैंने कुछ हद तक अपना कोड बदल दिया। अब यह सिर्फ है:

void Application_Error(object sender, EventArgs e) 
{ 
    HttpContext.Current.Cache["LastError"] = Server.GetLastError().GetBaseException(); 
    Server.ClearError(); 
} 

... और ...

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (IsPostBack) return; 

    if (HttpContext.Current.Cache["LastError"] != null) 
    { 
     Exception ex = (Exception)HttpContext.Current.Cache["LastError"]; 
     if (ex != null) 
      Label1.Text = ex.Message; 
    } 
} 

नोट एक महत्वपूर्ण यह है कि पहले से ही है तो इस त्रुटि को मुझे एहसास बनाने का कारण होगा ex.Data.Add वहाँ नहीं करता है, तो अनाम उपयोगकर्ता, और sessionid ClearError

+0

रिकॉर्ड के लिए, त्रुटियों पर रीडायरेक्ट करने वाले पेज वास्तव में परेशान हैं, क्योंकि वे आपको उस URL को भेजने के लिए अतिरिक्त कठिन बनाते हैं जिस पर मैंने त्रुटि देखी है, या बाद में पुनः प्रयास करें। –

+0

इसके अतिरिक्त, एक सर्वर। ट्रांसफर कुछ आंशिक पृष्ठ पोस्टबैक के लिए काम नहीं करेगा - हम ऐसा कर रहे थे लेकिन जब यह UpdatePanel – cloying

उत्तर

7

मुझे लगता है कि यह करने के लिए एक सभ्य तरीका है। ऐसा नहीं है कि मैं इसे करता हूं, लेकिन मेरा कोड पोस्ट करने के लिए बहुत लंबा है (और वीबी.नेट में)।

एक चीज जो मैं बदलूंगा वह त्रुटि पृष्ठ ही है। त्रुटि प्रदर्शित करने के बजाय, त्रुटि पृष्ठ पर एक वैकल्पिक फ़ील्ड के रूप में एक टेक्स्टबॉक्स जोड़ने पर विचार करें जहां उपयोगकर्ता अपना ईमेल पता दर्ज कर सकता है और आपको त्रुटि रिपोर्ट भेजने के लिए एक बटन क्लिक कर सकता है। फिर जब आपको त्रुटि रिपोर्ट प्राप्त होती है तो आप समस्या को देख सकते हैं और उन्हें जवाब दे सकते हैं। यह करने के लिए यह एक और अधिक उपयोगकर्ता के अनुकूल तरीका है और यह उन साइटों के लिए काफी अच्छा काम करता है जिन पर मैंने यह किया है।

उन पंक्तियों के साथ, आप फ़ॉर्म डेटा, सत्र डेटा और मूल्य के किसी अन्य चीज़ को भी इकट्ठा करना चाहते हैं और उसे त्रुटि रिपोर्ट में भी डाल सकते हैं। यह निदान समस्याओं को अधिक आसान बना सकता है।

+0

+1 अच्छा जवाब - मुझे उपयोगकर्ता को ईमेल भेजने के लिए थोड़ा सा कमरा देने का विचार पसंद है। हम वास्तव में ऐसा नहीं कर सकते हैं कि हमारे उपयोगकर्ता आधार के आकार के कारण हम सब कुछ डीबी में लॉग करते हैं। –

+0

धन्यवाद, यह हमारे लिए अच्छा काम करता है। हमारी सबसे बड़ी साइट पर, हमारे पास 50,000+ उपयोगकर्ता हमारे 15-20 पेज ऑनलाइन एप्लिकेशन को पूरा कर चुके हैं। और जो मैंने इस तकनीक के बारे में पाया है वह यह है कि उपयोगकर्ता की अपेक्षा और खुद के कारण यह तात्कालिकता की भावना पैदा करता है। यह सभी बग को खत्म करने के लिए मुझे प्रेरित करने का एक तरीका है। और एक बार ऐसा करने के बाद, मैं वेबसाइट का समर्थन करने में बहुत कम समय बिताता हूं और इसे बेहतर बनाने में अधिक समय लगाता हूं। –

+0

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

1

कैश वैश्विक होने के कारण यह सलाह नहीं दी जाएगी, जैसा कि आपने कहा है कि आप किसी को गलत त्रुटि प्रदर्शित कर सकते हैं। मुझे यह भी कहना चाहिए कि सुरक्षा कारणों से उपयोगकर्ताओं को सीधे समाप्त करने के लिए आपको त्रुटि संदेश आउटपुट नहीं करना चाहिए।

ASP.NET custom error page server GetLastError is null

निम्नलिखित की तरह कुछ डाल संक्षेप में:

Server.Transfer(String.Concat("~/Error.aspx?message=", HttpUtility.UrlEncode(ex.InnerException.Message))) 

बजाय ASP.NET पर निर्भर रीडायरेक्ट में सेटिंग्स का उपयोग करने के लिए

इस मुद्दे पर एक नज़र डालें कस्टमरर्स अनुभाग।

+1

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

1

हम ऐसा कुछ करते हैं जो आपके लिए काम कर सकता है या नहीं। हम डीबी में व्यापक लॉगिंग करते हैं। जब हमें कोई त्रुटि मिलती है, तो हम इसे लॉग करते हैं और यह एक त्रुटि आईडी उत्पन्न करता है। हम सामान्य आईडी पर त्रुटि आईडी के साथ रीडायरेक्ट करते हैं और वहां विवरण प्राप्त करते हैं।

निश्चित रूप से यह अपने चेहरे पर फ्लैट गिर जाता है जब त्रुटि है 'डीबी कनेक्ट नहीं कर सकता' लेकिन वह भी अक्सर ऐसा नहीं होता है;)

+0

+1 मुझसे - मेरा जवाब थोड़ा अलग है लेकिन हम डीबी लॉगिंग का भी उपयोग करते हैं, इसलिए मैंने आपको ऊपर उठाया। –

1

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

हमारे मामले में, हम उपयोगकर्ता की आईडी (यदि उपलब्ध हो) में भी पास करते हैं और जिस पृष्ठ में त्रुटि आई है (अनुरोध है कि URL अभी भी अच्छा है जब आप वैश्विक एप्लिकेशन_इरर पर जाते हैं)। इस तरह, हम त्रुटि को थोड़ा आसान ट्रैक कर सकते हैं। ध्यान दें कि आपको स्क्रिप्ट टैग के साथ Global.asax का उपयोग करने की आवश्यकता नहीं है। यदि आप अपनी App_Code निर्देशिका में Global.asax.cs फ़ाइल बनाते हैं, तो आप सीधे अपने सी # को कोड कर सकते हैं (हालांकि यह प्रोजेक्ट प्रकार पर निर्भर हो सकता है)।

0
Server.ClearError(); 

यह लाइन त्रुटि मैसेज को प्रदर्शित करने के बाद त्रुटि.aspx.cs पर रखी जानी चाहिए।

+0

मेरा मानना ​​है कि यह त्रुटि को कॉन्फ़िगरेशन के तहत Windows इवेंट लॉग में लॉग इन होने से रोक देगा। – Sam

0

मैं एक कस्टम त्रुटि पृष्ठ बनाने का प्रभारी था। web.config फ़ाइल मैं था में:: सब कुछ बहुत आसान था

<customErrors mode="On"> 
<error statusCode="404" redirect="~/error-pages/page-not-found.aspx?error=1" 
</customErrors> 

और Global.asax में, Application_Error विधि में: कुछ कोड ...

Server.Transfer("~/error-pages/error.aspx"); 

कस्टम त्रुटि में पेज "error.aspx": Server.ClearError();

मुझे नहीं पता कि वास्तव में क्या संशोधित किया गया था, लेकिन यह अब और काम नहीं किया। जब कोड सर्वर पर पहुंचा। ट्रांसफर विधि, एक अपवाद हमेशा उठाया गया था: पृष्ठ के लिए बच्चे के अनुरोध को निष्पादित करने में त्रुटि ...

मैंने कुछ समाधान देखा और अंत में यह पाया। मैं अपने कोड को संशोधित किया है, और अब यह काम करने लगता है:

<customErrors mode="On" defaultRedirect="~/error-pages/error.aspx"> 
    <error statusCode="404" redirect="~/error-pages/page-not-found.aspx?error=1" /> 
</customErrors> 

और Global.asax विधि में:

Session["LastError"] = Server.GetLastError(); 

यह भी कैश [ ""] कोड के साथ काम किया है, लेकिन मैं पसंद सत्र परिवर्तनीय।

तो, प्रतिक्रियाओं के लिए धन्यवाद।

  • कस्टम त्रुटि पृष्ठ में त्रुटि को साफ़ करना न भूलें। यह महत्वपूर्ण है। साथ ही, यह संकेत दिया जाएगा कि उपयोगकर्ता को बिल्कुल सही त्रुटि दिखाई न दे। शायद एक निश्चित उपयोगकर्ता के अनुकूल प्रारूप में। और सभी जानकारी एक लॉग फ़ाइल में दें, या इसे ईमेल या किसी अन्य चीज़ के माध्यम से भेजें।

आशा है कि यह उपयोगी था।