ASP.NET MVC 3 में कस्टम त्रुटि हैंडलिंग के लिए निश्चित दिशानिर्देश क्या हैं?


44

ASP.NET MVC (इस मामले में 3) में कस्टम त्रुटि हैंडलिंग की प्रक्रिया अविश्वसनीय रूप से उपेक्षित लगती है। मैंने वेब पर विभिन्न प्रश्नों और उत्तरों के माध्यम से पढ़ा है, विभिन्न उपकरणों (जैसे एल्माह) के लिए पृष्ठों की मदद करता हूं, लेकिन मुझे लगता है कि मैं एक पूर्ण चक्र में चला गया हूं और अभी भी सबसे अच्छा समाधान नहीं है। आपकी मदद से, शायद हम त्रुटि से निपटने के लिए एक नया मानक दृष्टिकोण सेट कर सकते हैं। मैं चीजों को सरल रखना चाहता हूं और इस पर अधिक इंजीनियर नहीं।

यहाँ मेरे लक्ष्य हैं:

सर्वर त्रुटियों / अपवादों के लिए:

  1. डिबगिंग जानकारी देव में प्रदर्शित करें
  2. उत्पादन में अनुकूल त्रुटि पृष्ठ प्रदर्शित करें
  3. त्रुटियों को लॉग करें और उन्हें उत्पादन में व्यवस्थापक को ईमेल करें
  4. 500 HTTP स्थिति कोड लौटाएं

404 नहीं मिली त्रुटियों के लिए:

  1. प्रदर्शन फ्रेंडली एरर पेज
  2. त्रुटियों को लॉग करें और उन्हें उत्पादन में व्यवस्थापक को ईमेल करें
  3. 404 HTTP स्थिति कोड लौटाएँ

क्या ASP.NET MVC के साथ इन लक्ष्यों को पूरा करने का कोई तरीका है?


2
मैं इस सवाल को एसओ को वापस माइग्रेट करना चाहता हूं ताकि इसे और अधिक उत्तर मिल सके। मैं कोडेड जवाब मांग रहा हूं।
शॉन मैक्लेन

@ शॉन ऐसा होने की संभावना नहीं है। प्रश्न यहाँ विषय पर अधिक है क्योंकि यह एसओ पर है और इसका एक स्वीकृत उत्तर है। प्रश्न भी आम तौर पर तकनीकी कारणों से नहीं मिलते हैं। यदि आपको किसी विशिष्ट त्रुटि-हैंडलिंग दृष्टिकोण को कोड करने में सहायता की आवश्यकता है, तो कृपया StackOverflow पर एक नया प्रश्न खोलें। अन्यथा, "कोडित उत्तर" उपयोगी या जवाबदेह होने के लिए बहुत व्यापक मानदंड हो सकते हैं। अंतिम लेकिन कम से कम, एक प्रश्न के लिए मध्यस्थ का ध्यान आकर्षित करने का सबसे अच्छा तरीका यह है कि इसे ध्वजांकित करें। यहाँ आपकी टिप्पणी की संभावना पर किसी का ध्यान नहीं गया होगा अगर यह 20 से अधिक टिप्पणी की संख्या को आगे बढ़ाते हुए एक ऑटो-फ्लैग की यात्रा नहीं करता है।
एडम लीयर

यहाँ लगभग 10 टिप्पणियाँ हुआ करती थीं, वे सभी कहाँ जाते थे?
रयानडब्ल्यू

मुझे एक समाधान मिला जो आपके लक्ष्यों को पूरा करता है। मेरे पास SO पर इसका एक और जवाब है: stackoverflow.com/questions/6508415/…
Jesse Webb

1
@AnnaLear मैं शॉन के साथ बैठती हूं। मुझे यह पृष्ठ केवल Google के माध्यम से मिला। ध्यान दें कि नीचे दिए गए लगभग सभी उत्तरों में लिंक बैक टू स्टैक ओवरफ्लो है। मेरे लिए जो वॉल्यूम बोलता है, उसमें उसे पहले स्थान पर छोड़ दिया जाना चाहिए था।
रेबेका

जवाबों:


23

मैं जिस तरह से मैं यह कर रहा हूँ, उसे साझा करूँगा, यह मूल प्रश्न का हिस्सा था।

सबसे पहले, समस्याओं का सामना करना पड़ा:

  1. CustomErrors on (यानी उत्पादन में) के साथ वैश्विक HandleErrorविशेषता अपवादों को निगल जाती है और आपकी त्रुटि दृश्य प्रदान करती है, लेकिन तब आप इसे एल्म जैसे एडऑन टूल से लॉग नहीं कर सकते हैं, क्योंकि एल्माह इसे कभी नहीं देखता है। आप इसे मेरे विचार से लॉग इन कर सकते हैं, लेकिन मुझे लगता है कि यह गलत है। वैश्विक हैंडलेयर विशेषता MVC 3 RTM विज़ुअल स्टूडियो प्रोजेक्ट टेम्पलेट में नई दिखाई देती है।

  2. एमवीसी एंडपॉइंट्स के लिए यूआरएल के साथ कस्टमरियर्स 302 स्टेटस कोड देता है। पुनर्निर्देशित संपत्ति है, लेकिन आप customErrors में mvc url से मेल नहीं खा सकते हैं और ResponseRewite मोड का उपयोग कर सकते हैं। ( https://stackoverflow.com/questions/781861/customerrors-does-not-work-when-setting-redirectmode-responserewrite/3770265#3770265 )

  3. CustomErrors को पूरी तरह से टालने और अपने ऐप में सब कुछ कस्टम को संभालने से बहुत अधिक जटिलता हो जाती है, IMO। (मैंने इसे देखा: https://stackoverflow.com/questions/619895/how-can-i-properly-handle-404s-in-asp-net-mvc/2577095#2577095 , लेकिन हमारी परियोजना के लिए सही नहीं था)

मेरा समाधान

मैंने एमवीसी को पूरी तरह से समीकरण से बाहर कर दिया है। मैंने HandleErrorAttributeGlobal.asax में वैश्विक फ़िल्टर हटा दिया है और ResponseRewrite302 HTTP प्रतिक्रिया कोड से बचने के लिए WebForm रीडायरेक्ट का उपयोग करने और पुनर्निर्देशन में बदलने के लिए इसे पूरी तरह से कस्टमErrors कॉन्फ़िगरेशन पर केंद्रित किया है ।

<customErrors mode="On" defaultRedirect="/Error.aspx" redirectMode="ResponseRewrite">
  <error statusCode="404" redirect="/NotFound.aspx" />
</customErrors>

फिर, NotFound.aspxpage_load इवेंट में, Response.StatusCode404 पर सेट करें और Error.aspx में कोड 500 सेट करें।

परिणाम:

दोनों के लिए लक्ष्य एल्मा लॉग, मैत्रीपूर्ण त्रुटि पृष्ठ, और कोड-बीहिंड्स पर कोड की एक पंक्ति के साथ स्थिति कोड प्राप्त किया गया है। हम इसे "MVC वे" नहीं कर रहे हैं जैसा कि पहले वाला समाधान करता है, लेकिन मैं इसके साथ ठीक हूं अगर यह कोड की दो लाइनें हैं।


5

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

ध्यान दें: आप एक फ्रेंडली एरर पेज नहीं दिखा सकते हैं और HTTP 404 या 500 को वापस लौटा सकते हैं जैसे आपका प्रश्न बताता है। जब आप एक फ्रेंडली एरर पेज को लौटाते हैं तो आपके ब्राउजर पर लौटा HTTP कोड 302 होगा। यह फ्रेंडली एरर पेज पर रीडायरेक्ट होता है।

मैत्रीपूर्ण त्रुटि पृष्ठ

ऐसा लगता है कि आप कुछ समय के लिए ASP.net का हिस्सा रही अच्छी 'ol फ़ैशन वाली web.config सेटिंग्स द्वारा अपने लक्ष्यों को प्राप्त कर सकते हैं। आप डिबग जानकारी दिखाने का उल्लेख करते हैं जब उत्पादन में अनुकूल पृष्ठ दिखाते हैं। आप इसके लिए web.config के कस्टम एरर्स सेक्शन का उपयोग कर सकते हैं (डिबग जानकारी दिखाने के लिए CustomErrors = "Off" सेट करें)। यदि आप इसे नहीं पढ़ते हैं, तो मैं यह मानने जा रहा हूं कि आप CustomErrors विशेषता से परिचित हैं:

http://msdn.microsoft.com/en-us/library/h0hfz6fc.aspx

यदि आपको नियंत्रण की अधिक बारीकियों की आवश्यकता है, तो आप किस त्रुटि को प्रदर्शित करते हैं, तो MVC के हैंडलेयर एट्रीब्यूट का उपयोग करें। इस तरह आप प्रत्येक एक्शन / कंट्रोलर के लिए अलग-अलग एरर व्यू चुन सकते हैं।

http://weblogs.asp.net/scottgu/archive/2008/07/14/asp-net-mvc-preview-4-release-part-1.aspx

अपवाद लॉगिंग

ऐसा लगता है कि आप अपने सभी अपवादों का उसी तरह से जवाब देना चाहते हैं ('त्रुटियों को लॉग करें और उन्हें उत्पादन में प्रशासक को ईमेल करें')। यदि यह मामला है तो आपके लिए सबसे सरल विकल्प कोड जोड़ना है

Application_Error (ऑब्जेक्ट प्रेषक, EventArgs e)

अपने ग्लोबल में। यह वह जगह है जहाँ आप अपने चुने हुए लॉगिंग ढांचे को बंद कर सकते हैं।

यदि आप अपने अपवाद लॉगिंग / हैंडलिंग पर अधिक नियंत्रण चाहते हैं तो आप HandleErrorAttribute और ओवरराइड को उप-वर्ग कर सकते हैं

OnException(System.Web.Mvc.ExceptionContext filterContext)

यह एक और जगह है जहाँ आप अपने चुने हुए लॉगिंग ढांचे को बंद कर सकते हैं।

https://stackoverflow.com/questions/183316/asp-net-mvc-handleerror

यह आपको ऊपर उल्लिखित Application_Error तकनीक से अधिक नियंत्रण प्रदान करता है।

सामान्य तौर पर एमवीसी आपको त्रुटियों को संभालने के लिए नियंत्रण का एक बड़ा दाने देता है। यदि आपको इस नियंत्रण की आवश्यकता नहीं है, तो आप ASP.net पर अपने वेब पर त्रुटि पृष्ठों को परिभाषित करने जैसे काम करने के तरीकों पर वापस आ सकते हैं।


अपने विचारों को जोड़ने के लिए बहुत बहुत धन्यवाद। मुझे लगता है कि मूल ASP.NET टीम द्वारा 302 स्थिति कोड खराब डिजाइन विकल्प है। मैं अपने उत्तरों में भी इस पर विचार करूंगा, ऐसा करने के लिए कुछ विकल्प हैं। ऐसा लगता है कि एमवीसी दुनिया में कुछ पूरी तरह से कस्टमErrors को छोड़ रहे हैं और बेहतर पुन: प्रयोज्य और अधिक नियंत्रण के लिए ऐप में सभी को संभाल रहे हैं जैसा कि आप बताते हैं। लेकिन, मुझे उन लोगों को लागू करने में सीमित सफलता मिली थी और बहुत सारे कोड जोड़ रहे थे जो ऐसा लगता था कि यह बेहतर तरीके से बेक किया गया था। नीचे मेरे जवाब में अधिक।

मैं लॉगिंग के लिए OnException विधि को ओवरराइड करना पसंद करता हूं, इस तरह से मुझे पता है कि मैं सब कुछ लॉग कर सकता हूं, यहां तक ​​कि एक अजाक्स कॉल से होने वाली त्रुटि जो मुझे लगता है कि आपके Application_Error को ट्रिगर नहीं करेगी ।
एलिसिया

@ एलिसिया पूर्ण नमूना कोड?
किकेनेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.