2012-12-12 17 views
11

जब मेरे एएसपी.नेट एमवीसी 4 एप्लिकेशन में कोई त्रुटि होती है, तो मैं त्रुटि के प्रकार के आधार पर उपयोगकर्ता के लिए एक दृश्य को कस्टमाइज़ करना चाहता हूं। उदाहरण के लिए, पृष्ठ नहीं मिला या अपवाद हुआ है (अपवाद के बारे में कुछ उपयोगकर्ता के अनुकूल विवरण के साथ)। मैंने स्टैक ओवरफ्लो और अन्य ऑनलाइन स्रोतों पर ऐसा करने के अन्य उदाहरणों की जांच की है, लेकिन कोई भी जवाब मेरे लिए काम नहीं कर रहा है।एएसपी.नेट एमवीसी 4 - अपवाद हैंडलिंग काम नहीं कर रहा है

मूल [हैंडलरर] विशेषता वीएस2012 में एमवीसी 4 एप्लिकेशन लक्ष्यीकरण .NET 4.5 के साथ काम नहीं कर रही प्रतीत होती है। यहाँ कोड मेरे घर नियंत्रक में मैं है:

[HandleError] 
public ActionResult Index() 
{ 
    Response.TrySkipIisCustomErrors = true; //doesn't work with or without this 
    throw new NullReferenceException("Uh oh, something broke."); 
} 

यह सिर्फ एक अपवाद फेंक रहा है, और मैं डिफ़ॉल्ट ~/साझा/Error.cshtml दृश्य [HandleError] विशेषता की वजह से लौटा दी की उम्मीद करेंगे, लेकिन मुझे बस एक HTTP 500 आंतरिक सर्वर त्रुटि मिलती है जो दर्शाती है कि पृष्ठ प्रदर्शित नहीं किया जा सका। मैंने अपने web.config की जांच की, और विभिन्न विन्यास अजीब व्यवहार कर रहे प्रतीत होते हैं। अनुभाग में, यह वर्तमान में शामिल हैं:

<customErrors mode="On" /> 

(मैं defaultRedirect जोड़ने और = "बंद" customErrors मोड के साथ की कोशिश की है और साथ ही, लेकिन वह कोई असर नहीं था ... न तो साझा त्रुटि दृश्य या कस्टमररर व्यू मुझे प्रस्तुत किया जा रहा है। अगर मैं कस्टम एरर मोड को बंद करता हूं, तो मैं अपवाद विवरण को अपेक्षित रूप से देख सकता हूं, इसलिए यह "ओह ओह, कुछ टूटा हुआ" अपवाद ठीक से फेंक रहा है।

मैंने भी कोशिश की है होमकंट्रोलर को ऑनएक्सप्शन हैंडलर जोड़ना, और हालांकि मैं डीबग कर सकता हूं और देख सकता हूं कि ऑनएक्सप्शन इवेंट उठाया जा रहा है, इससे कोई फर्क नहीं पड़ता:

protected override void OnException(ExceptionContext filterContext) 
{ 
    base.OnException(filterContext); 
    filterContext.ExceptionHandled = true; 
    if (filterContext == null) 
    { 
     filterContext.Result = View("CustomError"); 
     return; 
    } 
    Exception e = filterContext.Exception; 
    // TODO: Log the exception here 
    ViewData["Exception"] = e; // pass the exception to the view 
    filterContext.Result = View("CustomError"); 
} 

मैं भी एक दृश्य निर्दिष्ट करने के लिए [HandleError] को बदलने की कोशिश की है, लेकिन है कि या तो कुछ भी करने को नहीं लगता है:

[HandleError(View="CustomError")] 

किसी भी मदद की बहुत सराहना की जाएगी। अगर आपको और जानकारी चाहिए तो कृपया मुझे बताएं।

उत्तर

4

मुझे याद है कि आपको पृष्ठ को एक गैर-लोकलहोस्ट आईपी पते (आमतौर पर एक और कंप्यूटर) से कॉल करना था। और इसे एक आईआईएस आधारित सर्वर होना चाहिए, न कि अंतर्निहित विकास सर्वर (इसलिए आईआईएस या आईआईएस एक्सप्रेस, लेकिन फिर आपको बाहरी पहुंच के लिए आईआईएस एक्सप्रेस को कॉन्फ़िगर करना होगा, जो दर्द है)।

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

+1

का स्टेटस कोड भेजती है भले ही मैं web.config में कहीं भी 'रिमोटऑनली' का उपयोग नहीं कर रहा हूं, मेरा मूल कोड दूरस्थ रूप से काम करता प्रतीत होता है, बस स्थानीय रूप से नहीं! यह मेरे लिए बहुत आश्चर्यजनक है। विचारों को प्रस्तुत करने के लिए मुझे '' अनुभाग में '' अनुभाग में '' जोड़ना होगा, लेकिन यह सामान्य लगता है। इससे स्थानीय रूप से डीबग करना मुश्किल हो जाता है, और एक मोड की तरह लगता है क्योंकि 'मोड = रिमोटऑनली' का उपयोग नहीं किया जा रहा है। अगर किसी को पता चलता है कि इसे स्थानीय रूप से काम करने के लिए कैसे प्राप्त किया जाए, तो मुझे बताएं। (मैं इसके लिए एक दूसरा प्रश्न खोल सकता हूं।) –

1

customErrors टैग में निम्नलिखित एट्रीब्यूट जोड़ने का प्रयास करें:

defaultRedirect="Error" 

यह स्पष्ट रूप से परिभाषित करता है जो देखने के लिए MVC उपयोगकर्ता रीडायरेक्ट करना चाहिए जब त्रुटि फेंक दिया जाता है और कोई दृश्य विशेषता में डिफ़ॉल्ट रूप से निर्दिष्ट किया जाता है। यह निश्चित रूप से केवल तभी काम करेगा जब Error.cshtmlShared दृश्य फ़ोल्डर में मौजूद है।

+0

मैं अंततः इन सुझावों को आजमाने के लिए चारों ओर घूम रहा हूं। यह साझा त्रुटि दृश्य से सामग्री के बजाय 'defaultRrirect = "त्रुटि" /> 'पर मेरे पृष्ठ नॉटफाउंड त्रुटि पृष्ठ पर वापस लौटा हुआ है और व्यूडेटा में कोई अपवाद डेटा नहीं था। मैंने सोचा था कि ऐसा इसलिए था क्योंकि/सर्वर वास्तव में सर्वर पर मौजूद नहीं है और web.config वास्तविक विचारों के बारे में कुछ भी नहीं जानता ... लेकिन जब मैंने "त्रुटि" दृश्य का उपयोग करने के लिए ऑनएक्सप्शन हैंडलर को भी संशोधित किया, तो वह जिसके परिणामस्वरूप एक ही HTTP 500 त्रुटि हुई जो मैं सभी को देख रहा हूं, और अब मैं पेज नॉटफाउंड पेज नहीं देख रहा हूं। :( –

5

मैं भी एसओ उत्तरों पढ़ने और कस्टम त्रुटि पृष्ठों को काम करने के लिए मिश्रित ब्लॉग पोस्टिंग पढ़ने की एक सीमांत अंतहीन यात्रा पर चला गया। अंततः मेरे लिए क्या काम किया है।

पहला कदम आईआईएस एक्सप्रेस का उपयोग बिल्ट-इन कैसिनी वेब सर्वर के बजाय "गारंटी" के बजाय डीबगिंग के लिए करना है कि डीबग अनुभव लाइव वातावरण को दर्पण करेगा।

एप्लिकेशन त्रुटियों को संभालने के लिए एक नियंत्रक बनाएं और प्रत्येक कस्टम त्रुटि के लिए एक क्रिया जोड़ें जो आप संभालेंगे। कार्रवाई को कोई लॉगिंग करना चाहिए, स्टेटस कोड सेट करना चाहिए, और दृश्य वापस करना चाहिए। web.config में customErrors अनुभाग अपने कस्टम त्रुटि कार्यों पर रीडायरेक्ट करने

public class ErrorsController : Controller 
{ 
    // 404 
    [HttpGet] 
    public ActionResult NotFound() 
    { 
     Response.StatusCode = (int)HttpStatusCode.NotFound; 
     return View(); 
    } 

    // I also have test actions so that I can verify it's working in production. 
    [HttpGet] 
    public ActionResult Throw404() 
    { 
     throw new HttpException((int)HttpStatusCode.NotFound, "demo"); 
    } 
} 

कॉन्फ़िगर।

<system.web> 
    <customErrors mode="RemoteOnly" defaultRedirect="Errors/InternalServerError"> 
     <error statusCode="400" redirect="Errors/BadRequest" /> 
     <error statusCode="403" redirect="Errors/Forbidden" /> 
     <error statusCode="404" redirect="Errors/NotFound" /> 
     <error statusCode="500" redirect="Errors/InternalServerError" /> 
    </customErrors> 

web.config में विस्तृत करने के लिए system.webServer को httpErrors खंड जोड़ें और ErrorMode निर्धारित किया है। यह काम मेरे लिए एक रहस्य क्यों है, लेकिन यह कुंजी थी।

<system.webServer> 
    <httpErrors errorMode="Detailed" /> 

कस्टम पेज पर 404s निर्देशित करने के लिए परिभाषित मार्गों के लिए एक कैचल रूट जोड़ें।

  // catchall for 404s 
     routes.MapRoute(
      "Error", 
      "{*url}", 
      new {controller = "Errors", action = "NotFound"}); 

आप कस्टम HandleErrorAttribute बना सकते हैं और 500 त्रुटियों लॉग इन करने के लिए एक वैश्विक फिल्टर के रूप में यह रजिस्टर करने के लिए कर सकते हैं।

ये कदम दोनों विकास (आईआईएस एक्सप्रेस) और उत्पादन (आईआईएस 7) वातावरण में मेरे लिए काम करते थे। विकास में प्रभाव देखने के लिए आपको customErrors mode="On" को बदलने की जरूरत है।

+0

मैंने जांच की, और प्रोजेक्ट प्रॉपर्टीज> वेब से, इसे आईआईएस एक्सप्रेस की जांच के साथ "स्थानीय आईआईएस वेब सर्वर का उपयोग करें" के लिए डिफॉल्ट किया गया था। यह मुझे बाकी की जांच करने के लिए थोड़ा सा ले जाएगा। –

+1

404 के लिए मेरे कैच-ऑल रूट को हटाने के बाद , web.config को संशोधित करना, त्रुटियों का नियंत्रक बनाना, और त्रुटियों/{एक्शन} मार्गों को जोड़ना, ऐसा लगता है कि यह अपेक्षित काम नहीं करता है। ऐसा लगता है कि आईआईएस सर्वर त्रुटियों/ पर ठीक से रीडायरेक्ट नहीं कर रहा है कोड आते हैं। /त्रुटियों/ पर नेविगेट करना, काम करता है, लेकिन जब मैं 'Response.StatusCode' सेट करता हूं तो मुझे कस्टम पेज नहीं मिलता है। अगर मैं स्टेटस कोड हटा देता हूं, तो मुझे कस्टम पेज मिलता है, लेकिन यह' अन्य नहीं पाए गए पथ या अपवाद (/ब्लाह) पर ट्रिगर करें। मैंने स्थानीय और दूरस्थ रूप से परीक्षण किया है। –

+0

यदि रीडायरेक्ट काम नहीं कर रहे हैं, तो यह दृष्टिकोण व्यवहार्य हो सकता है (उदा। यह माना जाता है कि यह कस्टम त्रुटि पृष्ठों को प्रस्तुत करने के लिए आंतरिक सर्वर सर्वर त्रुटि दृश्य में वास्तविक अपवाद पारित करने में सक्षम नहीं हो सकता है, यदि आवश्यक हो)। –

1

मुझे एक ही समस्या का सामना करना पड़ा और कुछ समय बाद काम करने की कोशिश कर रहा था कि क्या हो रहा था। तो अगर किसी अन्य को भी इसी तरह की समस्या का सामना करना पड़ता है तो मेरी समस्या क्या थी।

त्रुटि पृष्ठ मेरे _Layout पृष्ठ का उपयोग करने का प्रयास कर रहा था। बस सुनिश्चित करें कि आप त्रुटि.cshtml पृष्ठ में

@ { लेआउट = शून्य; }

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