So funktionieren benutzerdefinierte Fehlerseiten in ASP.NET MVC 4

247

Ich möchte eine benutzerdefinierte Fehlerseite für 500, 404 und 403 anzeigen. Folgendes habe ich getan:

  1. Benutzerdefinierte Fehler in der web.config wurden wie folgt aktiviert:

    <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. HandleErrorAttributeAls globaler Aktionsfilter in der FilterConfigKlasse wie folgt registriert :

    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new CustomHandleErrorAttribute());
        filters.Add(new AuthorizeAttribute());
    }
    
  3. Für jede der oben genannten Nachrichten wurde eine benutzerdefinierte Fehlerseite erstellt. Die Standardeinstellung für 500 war bereits sofort verfügbar.

  4. In jeder benutzerdefinierten Fehlerseitenansicht wird angegeben, dass das Modell für die Seite ist System.Web.Mvc.HandleErrorInfo

Für 500 wird die benutzerdefinierte Fehlerseite angezeigt. Für andere nicht.

Fehlt mir etwas?

Es sieht so aus, als ob dies nicht alles ist, um benutzerdefinierte Fehler anzuzeigen, während ich den Code in der OnExceptionMethode der HandleErrorAttributeKlasse durchlese, und es werden nur 500 verarbeitet.

Was muss ich tun, um andere Fehler zu behandeln?

Wasserkühler v2
quelle
21
Das Seltsame an diesem Setup ist, dass Sie zu Ansichten umleiten, nicht zu Controller-Aktionen. Wer soll diese Ansichten rendern und beispielsweise ein Modell übergeben? Ich denke nur nach.
Oliver
2
Die meisten Antworten hier behandeln entweder nicht alle Fälle oder führen dazu, dass der Webserver "falsch" reagiert, dh auf eine Fehlerseite umleitet, anstatt eine Fehlerantwort zurückzugeben. Wenn Sie sich dafür interessieren, dass der Server so reagiert, wie es von Webservern erwartet wird, finden Sie hier einen ausführlichen Artikel: benfoster.io/blog/aspnet-mvc-custom-error-pages . Seien Sie gewarnt, dass dies nicht so einfach ist wie die Antworten hier. Wenn Sie also eine einfache Antwort wünschen, verwenden Sie stattdessen eine der folgenden.
rdans
1
Hier ist ein weiterer großartiger Artikel über verschiedene Techniken zur Behandlung von asp.net-Fehlern. Dusted.codes/…
Godsayah

Antworten:

352

Mein aktuelles Setup (auf MVC3, aber ich denke, es gilt immer noch) basiert auf einem ErrorController, also benutze ich:

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

Und der Controller enthält Folgendes:

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");
    }
}

Und die Ansichten genau so, wie Sie sie implementieren. Ich neige jedoch dazu, ein bisschen Logik hinzuzufügen, um die Stack-Trace- und Fehlerinformationen anzuzeigen, wenn sich die Anwendung im Debug-Modus befindet. Error.cshtml sieht also ungefähr so ​​aus:

@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>
Pablo Romeo
quelle
7
Mussten Sie für diesen Pablo etwas in Ihren Application_Error in Ihrer Global.asax einfügen?
Alicia
12
Der Code in der Steuerung scheint meiner Erfahrung nach nicht ausgeführt zu werden. MVC4 - Wenn Sie eine System.Exception in einem anderen Controller auslösen, wird die Datei Error.cshtml gerendert, jedoch nicht über den ErrorController. Hat das noch jemand erlebt?
Nilzor
53
Für alle anderen, die dies hilfreich fanden, aber mehr Kontext benötigten; Das <customErrors> -Tag befindet sich in <system.web> in web.config.
Gooberverse
7
Update für andere - anscheinend geschah mein Problem, weil ich redirectMode="ResponseRewrite"auf dem CustomerErrorsElement hatte
KyleMit
42
Bitte ignorieren Sie aus Liebe zu Gott den Kommentar //you may want to set this to 200im Code. TU DAS NICHT!
Dementic
40

Ich habe Pablo-Lösung gemacht und ich hatte immer den Fehler (MVC4)

Die Ansicht 'Fehler' oder ihr Master wurde nicht gefunden oder keine Ansichtsmaschine unterstützt den gesuchten Speicherort.

Um dies zu beseitigen , entfernen Sie die Linie

 filters.Add(new HandleErrorAttribute());

in FilterConfig.cs

Machinegon
quelle
Ich habe überall gesucht, um das zu lösen. Dies hatte endlich die Antwort. Ich wusste, warum es so war, aber zum Teufel konnte ich es nicht, ohne drastisch darüber nachzudenken, was andere Leute gesagt haben. Ich stelle mir vor, ich teile den Schmerz von 360Airwalk, wenn ich mich bedanke, dass Sie darauf hingewiesen haben. Legende!
Adam
Dies ist eine Option und die Fehlersteuerung funktioniert einwandfrei. Wenn Sie jedoch Filter in FilterConfig.cs registrieren, wird in den Ansichtsordnern der freigegebenen und ursprünglichen Controller nach Error.cshtml gesucht. Wenn Sie die Datei Error.cshtml in etwas anderes ändern, funktioniert unser benutzerdefinierter ErrorController. Es gibt jedoch einen Ort, an dem Sie diese Registrierung hinzufügen können, und es ist global.asax.cs. Wenn Sie die erwähnte Zeile in der Funktion RegisterGlobalFilters (GlobalFilterCollection-Filter) in global.asax.cs hinzufügen und aus FilterConfig.cs entfernen, funktioniert dies.
isaolmez
Ich denke, es hängt mit der Reihenfolge der Filterregistrierungen zusammen. Behalten Sie die Fehlersteuerung bei und verschieben Sie die Filterregistrierung nach global.asax.cs. public static void RegisterGlobalFilters (GlobalFilterCollection-Filter) {filter.Add (neues HandleErrorAttribute ()); }
isaolmez
24

Ich mache etwas, das weniger Codierung erfordert als die anderen veröffentlichten Lösungen.

Erstens habe ich in meiner web.config Folgendes:

<customErrors mode="On" defaultRedirect="~/ErrorPage/Oops">
   <error redirect="~/ErrorPage/Oops/404" statusCode="404" />
   <error redirect="~/ErrorPage/Oops/500" statusCode="500" />
</customErrors>

Der Controller (/Controllers/ErrorPageController.cs) enthält Folgendes:

public class ErrorPageController : Controller
{
    public ActionResult Oops(int id)
    {
        Response.StatusCode = id;

        return View();
    }
}

Und schließlich enthält die Ansicht Folgendes (der Einfachheit halber abgespeckt, kann aber Folgendes enthalten:

@{ ViewBag.Title = "Oops! Error Encountered"; }

<section id="Page">
  <div class="col-xs-12 well">
    <table cellspacing="5" cellpadding="3" style="background-color:#fff;width:100%;" class="table-responsive">
      <tbody>
        <tr>
          <td valign="top" align="left" id="tableProps">
            <img width="25" height="33" src="~/Images/PageError.gif" id="pagerrorImg">
          </td>
          <td width="360" valign="middle" align="left" id="tableProps2">
            <h1 style="COLOR: black; FONT: 13pt/15pt verdana" id="errortype"><span id="errorText">@Response.Status</span></h1>
          </td>
        </tr>
        <tr>
          <td width="400" colspan="2" id="tablePropsWidth"><font style="COLOR: black; FONT: 8pt/11pt verdana">Possible causes:</font>
          </td>
        </tr>
        <tr>
          <td width="400" colspan="2" id="tablePropsWidth2">
            <font style="COLOR: black; FONT: 8pt/11pt verdana" id="LID1">
                            <hr>
                            <ul>
                                <li id="list1">
                                    <span class="infotext">
                                        <strong>Baptist explanation: </strong>There
                                        must be sin in your life. Everyone else opened it fine.<br>
                                    </span>
                                </li>
                                <li>
                                    <span class="infotext">
                                        <strong>Presbyterian explanation: </strong>It's
                                        not God's will for you to open this link.<br>
                                    </span>
                                </li>
                                <li>
                                    <span class="infotext">
                                        <strong> Word of Faith explanation:</strong>
                                        You lack the faith to open this link. Your negative words have prevented
                                        you from realizing this link's fulfillment.<br>
                                    </span>
                                </li>
                                <li>
                                    <span class="infotext">
                                        <strong>Charismatic explanation: </strong>Thou
                                        art loosed! Be commanded to OPEN!<br>
                                    </span>
                                </li>
                                <li>
                                    <span class="infotext">
                                        <strong>Unitarian explanation:</strong> All
                                        links are equal, so if this link doesn't work for you, feel free to
                                        experiment with other links that might bring you joy and fulfillment.<br>
                                    </span>
                                </li>
                                <li>
                                    <span class="infotext">
                                        <strong>Buddhist explanation:</strong> .........................<br>
                                    </span>
                                </li>
                                <li>
                                    <span class="infotext">
                                        <strong>Episcopalian explanation:</strong>
                                        Are you saying you have something against homosexuals?<br>
                                    </span>
                                </li>
                                <li>
                                    <span class="infotext">
                                        <strong>Christian Science explanation: </strong>There
                                        really is no link.<br>
                                    </span>
                                </li>
                                <li>
                                    <span class="infotext">
                                        <strong>Atheist explanation: </strong>The only
                                        reason you think this link exists is because you needed to invent it.<br>
                                    </span>
                                </li>
                                <li>
                                    <span class="infotext">
                                        <strong>Church counselor's explanation:</strong>
                                        And what did you feel when the link would not open?
                                    </span>
                                </li>
                            </ul>
                            <p>
                                <br>
                            </p>
                            <h2 style="font:8pt/11pt verdana; color:black" id="ietext">
                                <img width="16" height="16" align="top" src="~/Images/Search.gif">
                                HTTP @Response.StatusCode - @Response.StatusDescription <br>
                            </h2>
                        </font>
          </td>
        </tr>
      </tbody>
    </table>
  </div>
</section>

So einfach ist das. Es könnte leicht erweitert werden, um detailliertere Fehlerinformationen anzubieten, aber ELMAH kümmert sich darum und der statusCode & statusDescription ist alles, was ich normalerweise brauche.

coderpro.net
quelle
Ich denke, die Umleitung in der .config-Datei von "~ / ErrorPage / Oops / 404" sollte wahrscheinlich "~ / ErrorPage / Oops? 404" sein, oder? Zumindest hat das bei mir funktioniert. Vielleicht hängt das nur vom Routing ab.
Josh Sutterfield
So simulieren Sie einen von IIS ausgelösten Fehler. Sei es 500 oder 504. Was tun in ASP.Net MVC - 5 Code, um die Ausnahme von IIS zu simulieren, damit ich meine benutzerdefinierte Fehlerseite testen kann
Unbreakable
12

Hier scheinen einige Schritte durcheinander zu sein. Ich werde vorschlagen, was ich von Grund auf getan habe.

  1. Erstellen Sie den ErrorPageController

    public class ErrorPageController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }
    
        public ActionResult Oops(int id)
        {
            Response.StatusCode = id;
            return View();
        }
    }
  2. Fügen Sie Ansichten für diese beiden Aktionen hinzu (Rechtsklick -> Ansicht hinzufügen). Diese sollten in einem Ordner namens ErrorPage angezeigt werden.

  3. Innerhalb App_Startöffnen FilterConfig.csund die Fehlerbehandlung Filter Kommentarzeile .

    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. Fügen Sie in web.config die folgenden <customerErrors>Einträge unter hinzuSystem.Web

    <customErrors mode="On" defaultRedirect="~/ErrorPage/Oops">
        <error redirect="~/ErrorPage/Oops/404" statusCode="404" />
        <error redirect="~/ErrorPage/Oops/500" statusCode="500" />
    </customErrors>
  5. Test (natürlich). Werfen Sie eine nicht behandelte Ausnahme in Ihren Code und sehen Sie, dass sie zur Seite mit der ID 500 wechselt. Verwenden Sie dann eine URL zu einer Seite, die nicht vorhanden ist, um 404 anzuzeigen.

VictorySaber
quelle
Ich habe diesen Fehler erhalten. An exception occurred while processing your request. Additionally, another exception occurred while executing the custom error page for the first exception. The request has been terminated.Alles, was ich von Ihrem Code aufgenommen habe, ist in der Datei web.config, die ich hinzugefügt habe, <error redirect = "~/ControllerName/ActionName" statusCode="404"/>und es hat gut funktioniert :) Der Rest des Codes stammt aus der Antwort von @ Pablo. Ich verwende MVC 5 und Entity Framework 6. Ich habe nicht filters.Add(new HandleErrorAttribute())ausFilterConfig.cs
sumedha
So simulieren Sie einen von IIS ausgelösten Fehler. Sei es 500 oder 504. Was tun in ASP.Net MVC - 5 Code, um die Ausnahme von IIS zu simulieren, damit ich meine benutzerdefinierte Fehlerseite testen kann
Unbreakable
Außerdem erfahren Sie, wie Sie eine nicht behandelte Ausnahme auslösen (Schritt 5). Ich bin neu in der Codierung, bitte Anleitung.
Unbreakable
Funktioniert immer noch nicht für mich? Was ist mit dem Routing? Muss ich auch die Seite Routing für Fehler hinzufügen? Wenn ich auf Seite: localhost: 84 / Enforcer / blah klicke, werde ich weitergeleitet zu: localhost: 84 / Enforcer / Enforcer / Error / NotFound? Aspxerrorpath = /… Die Fehlerseite sieht aus wie eine von Asp.NET bereitgestellte Standardfehlerseite. Irgendwelche Ideen?
Radek Strugalski
Das customerrors-Element in der webconfig sollte dies verhindern. Ihr (vom Projekt erstellter) Standardroutencode sollte einwandfrei funktionieren.
VictorySaber
11

Ich würde empfehlen, die Datei Global.asax.cs zu verwenden.

 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
    {
    }
}
maxspan
quelle
1
Ich hätte nicht gedacht, dass Sie einen Server.Transfer () in MVC ausführen können. Denken Sie, dass das OP eine gemischte Seite hat?
Rap
1
Warum sollten wir Application_Error in MVC verwenden? Wir haben Optionen wie [handleerror] attribut mit Umleitungs-URL-Optionen. Gibt es einen besonderen Vorteil von application_error?
Kurkula
Wir sollten HandleErrorAttribute in MVC verwenden und durch Überschreiben der OnException-Methode können wir sie viel besser handhaben
Kumar Lachhani,
7

Aufbauend auf der Antwort von maxspan habe ich auf GitHub ein minimales Beispielprojekt zusammengestellt, das alle Arbeitsteile zeigt.

Grundsätzlich fügen wir global.asax.cs nur eine Application_ErrorMethode hinzu , um die Ausnahme abzufangen und uns die Möglichkeit zu geben, eine Anforderung auf eine benutzerdefinierte Fehlerseite umzuleiten (oder genauer gesagt, die Anforderung zu übertragen ).

    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);
        }

    }

Fehlerkontrolle:

/// <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();
    }

}

Fehlerseitenansicht:

<!DOCTYPE html>

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

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

Es ist nichts anderes beteiligt, als das Deaktivieren / Entfernen filters.Add(new HandleErrorAttribute())in FilterConfig.cs

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

Obwohl dies sehr einfach zu implementieren ist, besteht der einzige Nachteil, den ich bei diesem Ansatz sehe, darin, Querystring zu verwenden, um Ausnahmeinformationen an die Zielfehlerseite zu liefern.

user3380909
quelle
3

Ich hatte alles eingerichtet, konnte aber auf unserem Staging-Server immer noch keine richtigen Fehlerseiten für den Statuscode 500 sehen, obwohl auf lokalen Entwicklungsservern alles einwandfrei funktionierte.

Ich habe diesen Blog-Beitrag von Rick Strahl gefunden, der mir geholfen hat.

Ich musste Response.TrySkipIisCustomErrors = true;meinen benutzerdefinierten Fehlerbehandlungscode ergänzen .

DCShannon
quelle
@ Shaun314 Du meinst, wo legst du diesen Code ab? In der Aktion, die die Anforderung verarbeitet. Sie können Beispiele in diesem Blog-Beitrag sehen.
DCShannon
2

Hier ist meine Lösung. Die Verwendung von [ExportModelStateToTempData] / [ImportModelStateFromTempData] ist meiner Meinung nach unangenehm.

~ / Views / Home / Error.cshtml:

@{
    ViewBag.Title = "Error";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

<h2>Error</h2>
<hr/>

<div style="min-height: 400px;">

    @Html.ValidationMessage("Error")

    <br />
    <br />

    <button onclick="Error_goBack()" class="k-button">Go Back</button>
    <script>
        function Error_goBack() {
            window.history.back()
        }
    </script>

</div>

~ / Controller / HomeController.sc:

public class HomeController : BaseController
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Error()
    {
        return this.View();
    }

    ...
}

~ / Controllers / BaseController.sc:

public class BaseController : Controller
{
    public BaseController() { }

    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        if (filterContext.Result is ViewResult)
        {
            if (filterContext.Controller.TempData.ContainsKey("Error"))
            {
                var modelState = filterContext.Controller.TempData["Error"] as ModelState;
                filterContext.Controller.ViewData.ModelState.Merge(new ModelStateDictionary() { new KeyValuePair<string, ModelState>("Error", modelState) });
                filterContext.Controller.TempData.Remove("Error");
            }
        }
        if ((filterContext.Result is RedirectResult) || (filterContext.Result is RedirectToRouteResult))
        {
            if (filterContext.Controller.ViewData.ModelState.ContainsKey("Error"))
            {
                filterContext.Controller.TempData["Error"] = filterContext.Controller.ViewData.ModelState["Error"];
            }
        }

        base.OnActionExecuted(filterContext);
    }
}

~ / Controller / MyController.sc:

public class MyController : BaseController
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult Details(int id)
    {
        if (id != 5)
        {
            ModelState.AddModelError("Error", "Specified row does not exist.");
            return RedirectToAction("Error", "Home");
        }
        else
        {
            return View("Specified row exists.");
        }
    }
}

Ich wünsche dir erfolgreiche Projekte ;-)

EINGESTEHEN
quelle
2

Sie können Fehler erhalten, die ordnungsgemäß funktionieren, ohne global.cs zu hacken, mit HandleErrorAttribute herumzuspielen, Response.TrySkipIisCustomErrors auszuführen, Application_Error anzuschließen oder was auch immer:

In system.web (nur das Übliche, ein / aus)

<customErrors mode="On">
  <error redirect="/error/401" statusCode="401" />
  <error redirect="/error/500" statusCode="500" />
</customErrors>

und in system.webServer

<httpErrors existingResponse="PassThrough" />

Jetzt sollten sich die Dinge wie erwartet verhalten, und Sie können Ihren ErrorController verwenden, um alles anzuzeigen, was Sie benötigen.

Robert Hoffmann
quelle
So simulieren Sie einen von IIS ausgelösten Fehler. Sei es 500 oder 504. Was tun in ASP.Net MVC - 5 Code, um die Ausnahme von IIS zu simulieren, damit ich meine benutzerdefinierte Fehlerseite testen kann
Unbreakable
@Unbreakable Ändern Sie vorübergehend Ihren Code, um eine Ausnahme auszulösen.
rufen
Hat für mich keinen Unterschied gemacht. Ich werde aufgrund einer Ausnahme oder eines nicht gefundenen Fehlers nicht zu meiner benutzerdefinierten Fehlerseite weitergeleitet.
pnizzle
0

Es scheint, ich bin zu spät zur Party gekommen, aber du solltest dir das auch besser ansehen.

Also system.webfür das Zwischenspeichern von Ausnahmen innerhalb der Anwendung wie return HttpNotFound ()

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

und system.webServerum Fehler aufzuholen, die von IIS abgefangen wurden und nicht zum asp.net-Framework gelangten

 <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>

Wenn Sie sich im letzten Fall Gedanken über die Client-Antwort machen, ändern Sie die Datei responseMode="Redirect"in responseMode="File"und liefern Sie eine statische HTML-Datei, da auf dieser Seite eine benutzerfreundliche Seite mit einem 200-Antwortcode angezeigt wird.

Oder Else
quelle
0

Fügen Sie dies in web.config unter dem Tag system.webserver wie folgt hinzu:

<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>

und fügen Sie einen Controller hinzu als,

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();
    }
}

und fügen Sie ihre respektierten Ansichten hinzu, dies wird definitiv funktionieren, denke ich für alle.

Diese Lösung habe ich gefunden aus: Neptune Century

Dpk-Kumar
quelle