त्वरित उत्तर / टीएल; डीआर
आलसी लोगों के लिए:
Install-Package MagicalUnicornMvcErrorToolkit -Version 1.0
फिर इस लाइन को हटा दें global.asax
GlobalFilters.Filters.Add(new HandleErrorAttribute());
और यह केवल IIS7 + और IIS एक्सप्रेस के लिए है।
यदि आप कैसिनी का उपयोग कर रहे हैं .. अच्छी तरह से .. उम .. एर .. अजीब ...
लंबा, समझाया गया उत्तर
मुझे पता है कि यह उत्तर दिया गया है। लेकिन जवाब वास्तव में सरल है (वास्तव में इसका जवाब देने के लिए डेविड फाउलर और डेमियन एडवर्ड्स के लिए खुश हैं)।
नहीं है कुछ भी कस्टम करने की कोई आवश्यकता ।
के लिए ASP.NET MVC3
, सभी बिट्स और टुकड़े हैं।
चरण 1 -> TWO स्पॉट में अपने web.config को अपडेट करें।
<system.web>
<customErrors mode="On" defaultRedirect="/ServerError">
<error statusCode="404" redirect="/NotFound" />
</customErrors>
तथा
<system.webServer>
<httpErrors errorMode="Custom">
<remove statusCode="404" subStatusCode="-1" />
<error statusCode="404" path="/NotFound" responseMode="ExecuteURL" />
<remove statusCode="500" subStatusCode="-1" />
<error statusCode="500" path="/ServerError" responseMode="ExecuteURL" />
</httpErrors>
...
<system.webServer>
...
</system.web>
अब मैंने जिन ROUTES का उपयोग करने का निर्णय लिया है, उन पर ध्यान दें। आप कुछ भी उपयोग कर सकते हैं, लेकिन मेरे मार्ग हैं
/NotFound
<- 404 नहीं मिला, त्रुटि पृष्ठ।
/ServerError
<- किसी अन्य त्रुटि के लिए, मेरे कोड में होने वाली त्रुटियां शामिल करें। यह एक 500 आंतरिक सर्वर त्रुटि है
देखें कि <system.web>
केवल एक कस्टम प्रविष्टि में पहले खंड में कैसे है ? statusCode="404"
प्रवेश? मैंने केवल एक स्थिति कोड सूचीबद्ध किया है, क्योंकि 500 Server Error
(यानी उन pesky त्रुटि जो आपके कोड में बग होने पर और उपयोगकर्ता के अनुरोध को क्रैश करता है) सहित अन्य सभी त्रुटियां होती हैं .. अन्य सभी त्रुटियां सेटिंग द्वारा नियंत्रित की जाती हैं defaultRedirect="/ServerError"
.. जो कहती है , यदि आप 404 पृष्ठ नहीं हैं, तो कृपया मार्ग नहीं मिला /ServerError
।
ठीक है। उस रास्ते से बाहर है .. अब मेरे मार्गों में सूचीबद्ध हैglobal.asax
चरण 2 - Global.asax में मार्गों का निर्माण
यहाँ मेरा पूरा मार्ग खंड है ..
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("{*favicon}", new {favicon = @"(.*/)?favicon.ico(/.*)?"});
routes.MapRoute(
"Error - 404",
"NotFound",
new { controller = "Error", action = "NotFound" }
);
routes.MapRoute(
"Error - 500",
"ServerError",
new { controller = "Error", action = "ServerError"}
);
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new {controller = "Home", action = "Index", id = UrlParameter.Optional}
);
}
वह दो अनदेखी मार्गों को सूचीबद्ध करता है -> axd's
और favicons
(ooo! बोनस अनदेखी मार्ग, आपके लिए!) तब (और आदेश महत्वपूर्ण है), मेरे पास मेरे दो स्पष्ट त्रुटि हैंडलिंग मार्ग हैं .. इसके बाद किसी भी अन्य मार्ग हैं। इस मामले में, डिफ़ॉल्ट एक। बेशक, मेरे पास अधिक है, लेकिन यह मेरी वेब साइट के लिए विशेष है। बस सुनिश्चित करें कि त्रुटि मार्ग सूची के शीर्ष पर हैं। आदेश अनिवार्य है ।
अंत में, जब हम अपनी global.asax
फ़ाइल के अंदर होते हैं , तो हम विश्व स्तर पर HandleError विशेषता को पंजीकृत नहीं करते हैं। नहीं, नहीं, नहीं सर। नड्डा। नहीं। निएन। नकारात्मक। Noooooooooo ...
इस लाइन को हटा दें global.asax
GlobalFilters.Filters.Add(new HandleErrorAttribute());
चरण 3 - कार्रवाई विधियों के साथ नियंत्रक बनाएं
अब .. हम दो क्रिया विधियों के साथ एक नियंत्रक जोड़ते हैं ...
public class ErrorController : Controller
{
public ActionResult NotFound()
{
Response.StatusCode = (int)HttpStatusCode.NotFound;
return View();
}
public ActionResult ServerError()
{
Response.StatusCode = (int)HttpStatusCode.InternalServerError;
// Todo: Pass the exception into the view model, which you can make.
// That's an exercise, dear reader, for -you-.
// In case u want to pass it to the view, if you're admin, etc.
// if (User.IsAdmin) // <-- I just made that up :) U get the idea...
// {
// var exception = Server.GetLastError();
// // etc..
// }
return View();
}
// Shhh .. secret test method .. ooOOooOooOOOooohhhhhhhh
public ActionResult ThrowError()
{
throw new NotImplementedException("Pew ^ Pew");
}
}
ठीक है, इसकी जाँच करें। सबसे पहले, यहाँ कोई [HandleError]
विशेषता नहीं है। क्यों? क्योंकि ASP.NET
फ्रेमवर्क में निर्मित पहले से ही त्रुटियों को संभाल रहा है और हमने एक त्रुटि को संभालने के लिए हमें जो कुछ भी करने की आवश्यकता है उसे निर्दिष्ट किया है :) यह इस पद्धति में है!
इसके बाद, मेरे पास दो कार्य विधियाँ हैं। वहां कुछ भी कठिन नहीं है। यदि आप कोई अपवाद जानकारी दिखाना चाहते हैं, तो Server.GetLastError()
आप उस जानकारी को प्राप्त करने के लिए उपयोग कर सकते हैं ।
बोनस डब्ल्यूटीएफ: हां, मैंने एक तीसरा एक्शन तरीका बनाया, त्रुटि से निपटने के लिए।
चरण 4 - दृश्य बनाएं
और अंत में, दो दृश्य बनाएं। इस नियंत्रक के लिए, उन्हें सामान्य दृश्य स्थान पर रखें।
बोनस टिप्पणी
- आप एक की जरूरत नहीं है
Application_Error(object sender, EventArgs e)
- उपरोक्त सभी चरण एल्माह के साथ पूरी तरह से 100% काम करते हैं । एल्मा फ्रैकिंग विक्स!
और वह, मेरे दोस्त, यह होना चाहिए।
अब, इसे पढ़ने के लिए बधाई और पुरस्कार के रूप में एक गेंडा है!