कस्टम ASP.NET MVC 404 त्रुटि पृष्ठ के लिए रूटिंग


116

मैं एक कस्टम HTTP 404 त्रुटि पेज बनाने की कोशिश कर रहा हूं जब कोई व्यक्ति किसी URL में टाइप करता है जो ASP.NET MVC में एक मान्य कार्रवाई या नियंत्रक को आमंत्रित नहीं करता है, इसके बजाय वह सामान्य "संसाधन नहीं मिला" ASP.NET त्रुटि प्रदर्शित करता है।

मैं इसे संभालने के लिए web.config का उपयोग नहीं करना चाहता।

क्या किसी प्रकार का रूटिंग मैजिक है जो मैं किसी अमान्य URL को पकड़ने के लिए कर सकता हूँ?

अद्यतन: मैंने दिए गए उत्तर की कोशिश की, हालांकि मुझे अभी भी बदसूरत "संसाधन नहीं मिला" संदेश मिलता है।

एक और अपडेट: ठीक है, जाहिरा तौर पर RC1 में कुछ बदल गया है। मैंने विशेष रूप से 404 को फंसाने की कोशिश की है HttpExceptionऔर यह अभी भी मुझे "संसाधन नहीं मिला" पृष्ठ देता है।

मैं भी MvcContrib है संसाधन सुविधा का उपयोग किया है और कुछ भी नहीं - एक ही समस्या है। कोई विचार?



@Peter एक ऐसा समाधान है जो मैंने जोड़ा है कि एक पृष्ठ को देखने के लिए HandleUnognAction को ओवरराइड करने के साथ-साथ एक पृष्ठ दिखाई नहीं देता है जब कोई कार्रवाई मौजूद नहीं है और फिर ASP.net कस्टम त्रुटि हैंडलर में बनाया गया है ताकि वे कुछ और कर सकें ताकि उपयोगकर्ता टाइप कर सकें ।
dswatik

@pete यह अच्छी तरह से stackoverflow.com/questions/619895/… के
dswatik

8
मैं इसे नफरत करता हूं जब अन्य उपयोगकर्ता उचित होते हैं और सामान की तरह कहते हैं, "आप ऐसा क्यों करना चाहते हैं? बस ऐसा करें ..." लेकिन मैं सुझाव दूंगा कि अगर web.config दृष्टिकोण का उपयोग करने से आपको कुछ भी नहीं रोक रहा है और यह आपकी आवश्यकताओं को पूरा करता है, यह एक मानक और सुरुचिपूर्ण दृष्टिकोण है। उस दृष्टिकोण पर किसी भी प्रतिक्रिया की सराहना की जाती है, क्योंकि बहुत अच्छी तरह से इसके साथ कुछ मुद्दा हो सकता है जिसके बारे में मुझे नहीं पता है।
सीन

जवाबों:


10

बस रूट तालिका के अंत में सभी रूट को जोड़ें और इसके साथ जो भी पेज आप चाहते हैं उसे प्रदर्शित करें।

देखें: मैं ASP.NET MVC के लिए '404 पृष्ठ नहीं मिला' प्रश्नों को संभालने के लिए सभी मार्ग कैसे पकड़ सकता हूं?


मैंने यह कोशिश की, फिर भी मुझे बदसूरत ASP.NET मिल गया डिफ़ॉल्ट संसाधन नहीं मिला संदेश ..
dswatik

3
मुझे इस समस्या का कोई निश्चित (और लचीला !!) समाधान न तो इस उत्तर में मिलता है और न ही दिए गए लिंक पर।
पीटर

4
न तो मैं ... यह एक हैकी जवाब की तरह लगता है। मैं ऐसे तरीके खोज रहा हूँ, जैसे कि कस्टमफ़ॉर्मर्स वैसा ही व्यवहार करते हैं जैसे वे वेबफ़ॉर्म में करते हैं। कोई विचार?
JC

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

105

मैंने 3 घंटे के लिए उत्पादन सर्वर पर कस्टम त्रुटियों को सक्षम करने की कोशिश की है, ऐसा लगता है कि मुझे अंतिम समाधान मिला है कि बिना किसी रूट के ASP.NET MVC में ऐसा कैसे करें।

ASP.NET MVC आवेदन में कस्टम त्रुटियों को सक्षम करने के लिए हमें (IIS 7+) की आवश्यकता है:

  1. वेब पृष्ठों को system.webअनुभाग के अंतर्गत कस्टम पृष्ठों में कॉन्फ़िगर करें :

    <customErrors mode="RemoteOnly"  defaultRedirect="~/error">
        <error statusCode="404" redirect="~/error/Error404" />
        <error statusCode="500" redirect="~/error" />
    </customErrors>

    RemoteOnlyइसका मतलब है कि स्थानीय नेटवर्क पर आपको वास्तविक त्रुटियां (विकास के दौरान बहुत उपयोगी) दिखाई देंगी। हम किसी भी त्रुटि कोड के लिए त्रुटि पृष्ठ को फिर से लिख सकते हैं।

  2. मैजिक रिस्पांस पैरामीटर और प्रतिक्रिया स्थिति कोड सेट करें (त्रुटि हैंडलिंग मॉड्यूल या त्रुटि हैंडल विशेषता में)

      HttpContext.Current.Response.StatusCode = 500;
      HttpContext.Current.Response.TrySkipIisCustomErrors = true;
  3. system.webServerसेक्शन के तहत वेब कॉन्फिग में एक और मैजिक सेटिंग सेट करें :

    <httpErrors errorMode="Detailed" />

यह अंतिम चीज थी जो मैंने पाया है और इसके बाद मैं उत्पादन सर्वर पर कस्टम त्रुटियों को देख सकता हूं।


8
यह अभी भी एक आदर्श समाधान नहीं है। यह आपको उचित HTTP प्रतिक्रिया कोड नहीं मिलता है। customErrorsअपने त्रुटि पृष्ठ को लोड करने के लिए 302 रीडायरेक्ट में परिणामों का उपयोग करना ।
जस्टिन हेलगर्सन

@ Ek0nomik मैंने कभी भी आदर्श समाधान नहीं देखा है :)
एंड्रयू ओरसिच

2
@JustinHelgerson I ने प्रत्येक स्टेटस कोड के लिए एक ErrorController सेटअप किया और उन क्रियाओं के अंदर रिस्पांस कोड सेट किए और यह रिस्पांस कोड ठीक करता है। मैंने फिडलर के साथ परीक्षण किया और 404 के साथ 404 स्टेटस कोड के साथ 404 और 500 के साथ 500 जवाब के साथ पेज का जवाब दिया। दोनों ही मामलों में मेरे कस्टम त्रुटि विचारों को परोसा जाता है
शेन नीविले

मेरी टीम के साथी ने यहां और यहां बताए अनुसार कस्टम त्रुटि पेज पर पुनर्निर्देशित करने के लिए 500 स्थिति कोड के साथ रनटाइम त्रुटि करने के लिए, साझा फ़ोल्डर के तहत त्रुटि दृश्य को हटा दिया । आशा किसी की मदद करती है।
शैजुत

41

मुझे इस आलेख में दिए गए विचारों को वापस करने वाले एक ErrorController बनाकर काम करने के लिए मेरी त्रुटि से निपटने में मदद मिली। मुझे Global.asax में मार्ग में "कैच ऑल" को भी जोड़ना था।

मैं यह नहीं देख सकता कि अगर यह Web.config में नहीं है, तो इसे इनमें से किसी भी त्रुटि पृष्ठ पर कैसे मिलेगा ..? मेरा Web.config को निर्दिष्ट करना था:

customErrors mode="On" defaultRedirect="~/Error/Unknown"

और फिर मैंने भी जोड़ा:

error statusCode="404" redirect="~/Error/NotFound"

2
धन्यवाद - जिसने मेरी मदद की, 2 साल बाद! यदि आप केवल 404 के लिए एक कस्टम त्रुटि चाहते हैं, तो आप और क्या करते हैं?
शुल बेहार

1
@Shaul एक और वर्ष बाद ... DefaultRedirect सेट न करें, विशेषता को पूरी तरह से बाहर करें।
एनजेई

27

स्रोत

NotFoundMVC - जब भी कोई नियंत्रक, क्रिया या मार्ग आपके ASP.NET MVC अनुप्रयोग में नहीं मिलता है, तो उपयोगकर्ता के अनुकूल 404 पृष्ठ प्रदान करता है। डिफ़ॉल्ट ASP.NET त्रुटि पृष्ठ के बजाय NotFound नामक दृश्य प्रस्तुत किया गया है।

आप इस प्लगइन को nuget के माध्यम से जोड़ सकते हैं: इंस्टाल-पैकेज NotFoundMvc

NotFoundMvc वेब एप्लिकेशन स्टार्ट-अप के दौरान स्वचालित रूप से स्थापित हो जाता है। यह सभी विभिन्न तरीकों को संभालता है 404 HttpException को आमतौर पर ASP.NET MVC द्वारा फेंका जाता है। इसमें एक लापता नियंत्रक, कार्रवाई और मार्ग शामिल हैं।

कदम से कदम गाइड स्थापना:

1 - अपने प्रोजेक्ट पर राइट क्लिक करें और Nuget Package प्रबंधित करें ...

2 - NotFoundMvcइसे खोजें और इंस्टॉल करें। यहां छवि विवरण दर्ज करें

3 - एक बार इंस्टॉलेशन पूरा हो जाने के बाद, दो फाइलें आपके प्रोजेक्ट में जुड़ जाएंगी। जैसा कि नीचे स्क्रीनशॉट में दिखाया गया है।

यहां छवि विवरण दर्ज करें

4 - दृश्य / साझा में मौजूद नए जोड़े गए NotFound.cshtml को खोलें और इसे अपनी इच्छा पर संशोधित करें। अब एप्लिकेशन को टाइप करें और एक गलत यूआरएल में टाइप करें, और आपको उपयोगकर्ता के अनुकूल 404 पेज के साथ बधाई दी जाएगी।

यहां छवि विवरण दर्ज करें

अब और नहीं, उपयोगकर्ताओं को त्रुटि संदेश मिलेगा Server Error in '/' Application. The resource cannot be found.

उम्मीद है की यह मदद करेगा :)

पुनश्च: इस तरह के एक भयानक प्लगइन बनाने के लिए एंड्रयू डेवी को यश ।


@niico स्रोत कोड को देखने से यह 404 के लिए प्रतिक्रिया कोड सेट करने के लिए प्रकट होता है, तो हाँ।
विल डीन

20

IIS त्रुटि पृष्ठों को बदलने के लिए web.config में यह प्रयास करें। यह सबसे अच्छा समाधान है जो मुझे लगता है, और यह सही स्थिति कोड भी भेजता है।

<system.webServer>
  <httpErrors errorMode="Custom" existingResponse="Replace">
    <remove statusCode="404" subStatusCode="-1" />
    <remove statusCode="500" subStatusCode="-1" />
    <error statusCode="404" path="Error404.html" responseMode="File" />
    <error statusCode="500" path="Error.html" responseMode="File" />
  </httpErrors>
</system.webServer>

टिपिला से अधिक जानकारी - कस्टम त्रुटि पेज ASP.NET MVC का उपयोग करें


1
+1। यह केवल एक चीज है जो कई क्षेत्रों के साथ एमवीसी 5 पर मेरे लिए लगातार काम कर रही है।
16

यह सबसे आसान उपाय है। यद्यपि आप अपने त्रुटि पृष्ठ में रेजर सिंटैक्स का उपयोग नहीं कर सकते हैं।
हिघसे

15

इस समाधान के लिए web.config फ़ाइल परिवर्तन या कैच-सभी मार्गों की आवश्यकता नहीं है।

सबसे पहले, इस तरह एक नियंत्रक बनाएं;

public class ErrorController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Title = "Regular Error";
        return View();
    }

    public ActionResult NotFound404()
    {
        ViewBag.Title = "Error 404 - File not Found";
        return View("Index");
    }
}

फिर "दृश्य / त्रुटि / Index.cshtml" के तहत दृश्य बनाएं;

 @{
      Layout = "~/Views/Shared/_Layout.cshtml";
  }                     
  <p>We're sorry, page you're looking for is, sadly, not here.</p>

फिर नीचे के रूप में ग्लोबल असैक्स फ़ाइल में निम्नलिखित जोड़ें:

protected void Application_Error(object sender, EventArgs e)
{
        // Do whatever you want to do with the error

        //Show the custom error page...
        Server.ClearError(); 
        var routeData = new RouteData();
        routeData.Values["controller"] = "Error";

        if ((Context.Server.GetLastError() is HttpException) && ((Context.Server.GetLastError() as HttpException).GetHttpCode() != 404))
        {
            routeData.Values["action"] = "Index";
        }
        else
        {
            // Handle 404 error and response code
            Response.StatusCode = 404;
            routeData.Values["action"] = "NotFound404";
        } 
        Response.TrySkipIisCustomErrors = true; // If you are using IIS7, have this line
        IController errorsController = new ErrorController();
        HttpContextWrapper wrapper = new HttpContextWrapper(Context);
        var rc = new System.Web.Routing.RequestContext(wrapper, routeData);
        errorsController.Execute(rc);

        Response.End();
}

यदि आपको ऐसा करने के बाद भी कस्टम IIS त्रुटि पृष्ठ मिलता है, तो सुनिश्चित करें कि वेब कॉन्फ़िगरेशन फ़ाइल में निम्नलिखित खंडों (या खाली) पर टिप्पणी की गई है:

<system.web>
   <customErrors mode="Off" />
</system.web>
<system.webServer>   
   <httpErrors>     
   </httpErrors>
</system.webServer>

मुझे नहीं लगता कि यह दृष्टिकोण सभी मामलों में काम करेगा, क्योंकि 404 अक्सर वेब सर्वर द्वारा अवरोधन किया जाता है और इसलिए कभी भी आवेदन के स्तर पर नियंत्रित नहीं किया जाता है।
क्रिस हैल्क्रो

मैं जोड़ना चाहता हूं कि यदि आप इस दृष्टिकोण के साथ जाते हैं, तो मैं Response.End();आपके Application_Error हैंडलर के अंत में एक जोड़ने की सलाह दूंगा। इसके बिना, किसी दिए गए सत्र के लिए त्रुटि की पहली घटना शुरू हो जाती है, जो कि आपके पास एक मुद्दा है, उदाहरण के लिए, Application_Error हैंडलर में कस्टम त्रुटि लॉगिंग।
कीथ १

6

यदि आप एमवीसी 4 में काम करते हैं, तो आप इस समाधान को देख सकते हैं, इसने मेरे लिए काम किया।

निम्नलिखित Application_Error विधि को मेरे साथ जोड़ें Global.asax:

protected void Application_Error(object sender, EventArgs e)
{
    Exception exception = Server.GetLastError();
    Server.ClearError();

    RouteData routeData = new RouteData();
    routeData.Values.Add("controller", "Error");
    routeData.Values.Add("action", "Index");
    routeData.Values.Add("exception", exception);

    if (exception.GetType() == typeof(HttpException))
    {
        routeData.Values.Add("statusCode", ((HttpException)exception).GetHttpCode());
    }
    else
    {
        routeData.Values.Add("statusCode", 500);
    }

    IController controller = new ErrorController();
    controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData));
    Response.End();

नियंत्रक स्वयं बहुत सरल है:

public class ErrorController : Controller
{
    public ActionResult Index(int statusCode, Exception exception)
    {
        Response.StatusCode = statusCode;
        return View();
    }
}

GitHub पर Mvc4CustomErrorPage का पूर्ण स्रोत कोड देखें ।


0

मुझे वही समस्या थी, जो आपको करना है वह यह है कि अपने व्यू फ़ोल्डर में web.config फ़ाइल में customErrors विशेषता जोड़ने के बजाय, आपको इसे अपने प्रोजेक्ट्स रूट फ़ोल्डर में web.config फ़ाइल में जोड़ना होगा


0

यहां सही उत्तर है जो एकल स्थान में त्रुटि पृष्ठ को पूरी तरह से अनुकूलित करने की अनुमति देता है। Web.config को संशोधित करने या अलग कोड बनाने की आवश्यकता नहीं है।

MVC 5 में भी काम करता है।

इस कोड को कंट्रोलर में जोड़ें:

        if (bad) {
            Response.Clear();
            Response.TrySkipIisCustomErrors = true;
            Response.Write(product + I(" Toodet pole"));
            Response.StatusCode = (int)HttpStatusCode.NotFound;
            //Response.ContentType = "text/html; charset=utf-8";
            Response.End();
            return null;
        }

Http://www.eidias.com/blog/2014/7/2/mvc-custom-error-pages के आधार पर


0

मैं कुछ विशिष्ट मामलों के बारे में बात करूंगा,

यदि आप नीचे की तरह HomeController में 'PageNotFound विधि' का उपयोग कर रहे हैं

[Route("~/404")]
public ActionResult PageNotFound()
{
  return MyView();
}

यह इस काम नहीं करेगा। लेकिन आपको नीचे दिए गए रूट टैग को साफ़ करना होगा,

//[Route("~/404")]
public ActionResult PageNotFound()
{
  return MyView();
}

और अगर आप इसे वेब में विधि नाम के रूप में बदलते हैं । यह काम करता है। हालांकि नीचे web.config की तरह कोड करने के लिए मत भूलना

<customErrors mode="On">
  <error statusCode="404" redirect="~/PageNotFound" /> 
 *// it is not "~/404" because it is not accepted url in Route Tag like [Route("404")]*
</customErrors>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.