asp.net - एएसपी.नेट एमवीसी 4 में कस्टम त्रुटि पेज कैसे काम करें




asp.net-mvc asp.net-mvc-4 (8)

Maxspan द्वारा पोस्ट किए गए उत्तर पर बिल्डिंग, मैंने गिटहब पर एक न्यूनतम नमूना प्रोजेक्ट को सभी कामकाजी हिस्सों को दिखाया है।

असल में, हम अपवाद को रोकने के लिए global.asax.cs पर केवल एक Application_Error विधि जोड़ते हैं और हमें एक कस्टम त्रुटि पृष्ठ पर रीडायरेक्ट (या अधिक सही तरीके से, स्थानांतरण अनुरोध ) को रीडायरेक्ट करने का अवसर देते हैं।

    protected void Application_Error(Object sender, EventArgs e)
    {
        // See http://stackoverflow.com/questions/13905164/how-to-make-custom-error-pages-work-in-asp-net-mvc-4
        // for additional context on use of this technique

        var exception = Server.GetLastError();
        if (exception != null)
        {
            // This would be a good place to log any relevant details about the exception.
            // Since we are going to pass exception information to our error page via querystring,
            // it will only be practical to issue a short message. Further detail would have to be logged somewhere.

            // This will invoke our error page, passing the exception message via querystring parameter
            // Note that we chose to use Server.TransferRequest, which is only supported in IIS 7 and above.
            // As an alternative, Response.Redirect could be used instead.
            // Server.Transfer does not work (see https://support.microsoft.com/en-us/kb/320439 )
            Server.TransferRequest("~/Error?Message=" + exception.Message);
        }

    }

त्रुटि नियंत्रक:

/// <summary>
/// This controller exists to provide the error page
/// </summary>
public class ErrorController : Controller
{
    /// <summary>
    /// This action represents the error page
    /// </summary>
    /// <param name="Message">Error message to be displayed (provided via querystring parameter - a design choice)</param>
    /// <returns></returns>
    public ActionResult Index(string Message)
    {
        // We choose to use the ViewBag to communicate the error message to the view
        ViewBag.Message = Message;
        return View();
    }

}

त्रुटि पृष्ठ देखें:

<!DOCTYPE html>

<html>
<head>
    <title>Error</title>
</head>
<body>

    <h2>My Error</h2>
    <p>@ViewBag.Message</p>
</body>
</html>

filters.Add(new HandleErrorAttribute()) को अक्षम / हटाने के अलावा, और कुछ भी शामिल नहीं है। AddCodfig.cs में जोड़ें filters.Add(new HandleErrorAttribute()) हैंडलरर एट्रिब्यूट filters.Add(new HandleErrorAttribute())

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        //filters.Add(new HandleErrorAttribute()); // <== disable/remove
    }
}

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

मैं 500, 404 और 403 के लिए दिखाया गया एक कस्टम त्रुटि पृष्ठ चाहता हूं। यहां मैंने जो किया है:

  1. निम्नानुसार web.config में सक्षम कस्टम त्रुटियां:

    <customErrors mode="On" 
                  defaultRedirect="~/Views/Shared/Error.cshtml">
    
        <error statusCode="403" 
               redirect="~/Views/Shared/UnauthorizedAccess.cshtml" />
    
        <error statusCode="404" 
               redirect="~/Views/Shared/FileNotFound.cshtml" />
    
    </customErrors>
    
  2. निम्नानुसार FilterConfig क्लास में एक वैश्विक एक्शन फ़िल्टर के रूप में पंजीकृत FilterConfig :

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new CustomHandleErrorAttribute());
        filters.Add(new AuthorizeAttribute());
    }
    
  3. उपर्युक्त संदेशों में से प्रत्येक के लिए एक कस्टम त्रुटि पृष्ठ बनाया गया है। 500 के लिए डिफ़ॉल्ट एक बॉक्स से पहले ही उपलब्ध था।

  4. प्रत्येक कस्टम त्रुटि पृष्ठ में घोषित किया गया है कि पृष्ठ के लिए मॉडल System.Web.Mvc.HandleErrorInfo

500 के लिए, यह कस्टम त्रुटि पृष्ठ दिखाता है। दूसरों के लिए, यह नहीं है।

क्या मैं कुछ छोड़ रहा हूं?

ऐसा लगता है कि कस्टम त्रुटियों को प्रदर्शित करने के लिए यह सब कुछ नहीं है जैसा कि मैंने OnException क्लास की OnException विधि में कोड के माध्यम से पढ़ा है और यह केवल 500 को OnException रहा है।

अन्य त्रुटियों को संभालने के लिए मुझे क्या करना है?


Web.config में इसे system.webserver टैग के नीचे नीचे जोड़ें,

<system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404"/>
  <remove statusCode="500"/>
  <error statusCode="404" responseMode="ExecuteURL" path="/Error/NotFound"/>
  <error statusCode="500" responseMode="ExecuteURL"path="/Error/ErrorPage"/>
</httpErrors>

और एक नियंत्रक के रूप में जोड़ें,

public class ErrorController : Controller
{
    //
    // GET: /Error/
    [GET("/Error/NotFound")]
    public ActionResult NotFound()
    {
        Response.StatusCode = 404;

        return View();
    }

    [GET("/Error/ErrorPage")]
    public ActionResult ErrorPage()
    {
        Response.StatusCode = 500;

        return View();
    }
}

और उनके सम्मानित विचार जोड़ें, यह निश्चित रूप से काम करेगा मैं सभी के लिए अनुमान लगाता हूं।

इस समाधान से मैंने इसे पाया: नेप्च्यून सेंचुरी


ऐसा लगता है कि मैं पार्टी के लिए देर से आया था, लेकिन आपको इसे बेहतर तरीके से देखना चाहिए।

तो system.web में एप्लिकेशन के भीतर अपवादों को कैशिंग करने के लिए जैसे HttpNotFound ()

  <system.web>
    <customErrors mode="RemoteOnly">
      <error statusCode="404" redirect="/page-not-found" />
      <error statusCode="500" redirect="/internal-server-error" />
    </customErrors>
  </system.web>

और system.webServer में आईआईएस द्वारा पकड़े गए त्रुटियों को पकड़ने के लिए system.webServer और system.webServer ढांचे के लिए अपना रास्ता नहीं बनाया

 <system.webServer>
    <httpErrors errorMode="DetailedLocalOnly">
      <remove statusCode="404"/>
      <error statusCode="404" path="/page-not-found" responseMode="Redirect"/>
      <remove statusCode="500"/>
      <error statusCode="500" path="/internal-server-error" responseMode="Redirect"/>
  </system.webServer>

आखिरी में यदि आप ग्राहक प्रतिक्रिया के बारे में चिंता करते हैं तो responseMode="Redirect" responseMode="File" को responseMode="File" और एक स्थिर HTML फ़ाइल की सेवा करें, क्योंकि यह 200 प्रतिक्रिया कोड के साथ एक दोस्ताना पृष्ठ प्रदर्शित करेगा।


मेरा वर्तमान सेटअप ( ErrorController पर, लेकिन मुझे लगता है कि यह अभी भी लागू होता है) ErrorController होने पर निर्भर करता है, इसलिए मैं इसका उपयोग करता हूं:

<system.web>
    <customErrors mode="On" defaultRedirect="~/Error">
      <error redirect="~/Error/NotFound" statusCode="404" />
    </customErrors>
</system.web>

और नियंत्रक में निम्नलिखित शामिल हैं:

public class ErrorController : Controller
{
    public ViewResult Index()
    {
        return View("Error");
    }
    public ViewResult NotFound()
    {
        Response.StatusCode = 404;  //you may want to set this to 200
        return View("NotFound");
    }
}

और विचारों को आप जिस तरह से लागू करते हैं। यदि अनुप्रयोग डीबग मोड में है तो स्टैक ट्रेस और त्रुटि जानकारी दिखाने के लिए, हालांकि मैं थोड़ा सा तर्क जोड़ता हूं। तो Error.cshtml ऐसा कुछ दिखता है:

@model System.Web.Mvc.HandleErrorInfo
@{
    Layout = "_Layout.cshtml";
    ViewBag.Title = "Error";
}
<div class="list-header clearfix">
    <span>Error</span>
</div>
<div class="list-sfs-holder">
    <div class="alert alert-error">
        An unexpected error has occurred. Please contact the system administrator.
    </div>
    @if (Model != null && HttpContext.Current.IsDebuggingEnabled)
    {
        <div>
            <p>
                <b>Exception:</b> @Model.Exception.Message<br />
                <b>Controller:</b> @Model.ControllerName<br />
                <b>Action:</b> @Model.ActionName
            </p>
            <div style="overflow:scroll">
                <pre>
                    @Model.Exception.StackTrace
                </pre>
            </div>
        </div>
    }
</div>

मेरे पास सबकुछ स्थापित हुआ था, लेकिन फिर भी हमारे विकास सर्वर पर स्टेटस कोड 500 के लिए उचित त्रुटि पेज नहीं देख पाए, तथ्य यह है कि स्थानीय विकास सर्वर पर सब कुछ ठीक काम करता है।

मुझे रिक स्ट्राल से यह ब्लॉग पोस्ट मिला जिसने मेरी मदद की।

मुझे Response.TrySkipIisCustomErrors = true; जोड़ने की आवश्यकता थी Response.TrySkipIisCustomErrors = true; मेरे कस्टम त्रुटि हैंडलिंग कोड के लिए।


मैं Global.asax.cs फ़ाइल का उपयोग करने की सिफारिश करता हूं।

 protected void Application_Error(Object sender, EventArgs e)
{
    var exception = Server.GetLastError();
    if (exception is HttpUnhandledException)
    {
        Server.Transfer("~/Error.aspx");
    }
    if (exception != null)
    {
        Server.Transfer("~/Error.aspx");
    }
    try
    {
        // This is to stop a problem where we were seeing "gibberish" in the
        // chrome and firefox browsers
        HttpApplication app = sender as HttpApplication;
        app.Response.Filter = null;
    }
    catch
    {
    }
}

मैंने पाब्लो समाधान किया है और मुझे हमेशा त्रुटि थी (एमवीसी 4)

दृश्य 'त्रुटि' या उसके मास्टर को नहीं मिला था या कोई दृश्य इंजन खोजे गए स्थान का समर्थन नहीं करता है।

इससे छुटकारा पाने के लिए, रेखा को हटा दें

 filters.Add(new HandleErrorAttribute());

FilterConfig.cs में


यहां एक साथ जुड़ा हुआ कई कदम हैं। मैं आगे बढ़ूंगा जो मैंने खरोंच से किया था।

  1. ErrorPage नियंत्रक बनाएँ

    public class ErrorPageController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    
        public ActionResult Oops(int id)
        {
            Response.StatusCode = id;
            return View();
        }
    }
    
  2. इन दो कार्यों के लिए विचार जोड़ें (दायाँ क्लिक करें -> दृश्य जोड़ें)। ये ErrorPage नामक फ़ोल्डर में दिखाई देना चाहिए।

  3. App_Start अंदर App_Start खोलें और त्रुटि हैंडलिंग फ़िल्टर को टिप्पणी करें।

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        // Remove this filter because we want to handle errors ourselves via the ErrorPage controller
        //filters.Add(new HandleErrorAttribute());
    }
    
  4. Web.config के अंदर System.Web अंतर्गत निम्न <customerErrors> System.Web <customerErrors> प्रविष्टियां जोड़ें

    <customErrors mode="On" defaultRedirect="~/ErrorPage/Oops">
        <error redirect="~/ErrorPage/Oops/404" statusCode="404" />
        <error redirect="~/ErrorPage/Oops/500" statusCode="500" />
    </customErrors>
    
  5. टेस्ट (बेशक)। अपने कोड में एक अनचाहे अपवाद फेंको और इसे आईडी 500 के साथ पेज पर जाएं, और उसके बाद उस पृष्ठ पर एक यूआरएल का उपयोग करें जो 404 देखने के लिए मौजूद नहीं है।





asp.net-mvc-4