wake-up-neo.net

Routing für benutzerdefinierte ASP.NET MVC 404-Fehlerseite

Ich versuche, eine benutzerdefinierte HTTP 404-Fehlerseite zu erstellen, wenn jemand eine URL eingibt. __, die keine gültige Aktion oder einen Controller in ASP.NET MVC aufruft, stattdessen das generische ASP.NET "Resource Not Found" (Ressource nicht gefunden) anzeigt Error.

Ich möchte nicht die web.config verwenden, um damit umzugehen.

Gibt es irgendeine Art von Routing-Magie, die ich tun kann, um ungültige URLs zu finden?

Update: Ich habe die Antwort ausprobiert, bekomme aber immer noch die hässliche "Resource Not Found" -Meldung.

Noch ein Update: Ok, anscheinend hat sich etwas in RC1 geändert. Ich habe sogar versucht, 404 spezifisch auf eine HttpException zu fangen, und es gibt mir immer noch die Seite "Ressource nicht gefunden".

Ich habe sogar die Funktion der Ressource von MvcContrib verwendet und nichts - dasselbe Problem. Irgendwelche Ideen?

110
dswatik

Fügen Sie einfach alle Routen am Ende der Routentabelle hinzu und zeigen Sie die gewünschte Seite damit an.

Siehe: Wie kann ich eine Catch All-Route erstellen, um "404-Seite nicht gefundene" Abfragen für ASP.NET MVC zu verarbeiten?

9
Alex Reitbort

Ich habe versucht, benutzerdefinierte Fehler auf dem Produktionsserver für 3 Stunden zu aktivieren. Ich habe die endgültige Lösung gefunden, wie dies in ASP.NET MVC ohne Routen möglich ist.

Um benutzerdefinierte Fehler in der ASP.NET-MVC-Anwendung zu aktivieren, benötigen wir (IIS 7+):

  1. Konfigurieren Sie benutzerdefinierte Seiten in der Web-Konfiguration im Abschnitt system.web:

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

    RemoteOnly bedeutet, dass im lokalen Netzwerk echte Fehler angezeigt werden (sehr nützlich während der Entwicklung). Wir können die Fehlerseite auch für jeden Fehlercode umschreiben.

  2. Setze den magischen Antwortparameter und den Antwortstatuscode (im Fehlerbehandlungsmodul oder im Fehlerbehandlungsattribut)

      HttpContext.Current.Response.StatusCode = 500;
      HttpContext.Current.Response.TrySkipIisCustomErrors = true;
    
  3. Stellen Sie in der Web-Konfiguration im Abschnitt system.webServer eine weitere magische Einstellung ein:

    <httpErrors errorMode="Detailed" />
    

Dies war das letzte, was ich gefunden habe, und danach kann ich benutzerdefinierte Fehler auf dem Produktionsserver sehen.

101
Andrew Orsich

Ich habe meine Fehlerbehandlung zum Laufen gebracht, indem ich einen ErrorController erstellt habe, der die Ansichten in diesem Artikel zurückgibt. Ich musste der Route in global.asax auch "Catch All" hinzufügen. 

Ich kann nicht sehen, wie es zu einer dieser Fehlerseiten kommt, wenn es nicht in der Web.config ist ..? Meine Web.config musste angeben:

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

und dann habe ich noch hinzugefügt:

error statusCode="404" redirect="~/Error/NotFound"
41
Jack Smit

Quelle

NotFoundMVC - Stellt eine benutzerfreundliche 404-Seite bereit, wenn in Ihrer ASP.NET MVC3-Anwendung kein Controller, eine Aktion oder eine Route gefunden wird .. Eine Ansicht namens NotFound wird anstelle der Standard-Fehlerseite von ASP.NET gerendert.

Sie können dieses Plugin über nuget hinzufügen mit: Install-Package NotFoundMvc

NotFoundMvc installiert sich automatisch beim Start der Webanwendung. Es behandelt all die verschiedenen Arten, wie eine 404 HttpException normalerweise von ASP.NET MVC ausgelöst wird. Dazu gehören ein fehlender Controller, eine Aktion und eine Route.

Schritt für Schritt Installationsanleitung:

1 - Klicken Sie mit der rechten Maustaste auf Ihr Projekt und wählen Sie "Nuget-Pakete verwalten" aus.

2 - Suchen Sie nach NotFoundMvc und installieren Sie es .enter image description here

3 - Nach Abschluss der Installation werden Ihrem Projekt zwei Dateien hinzugefügt. Wie in den folgenden Screenshots gezeigt.

enter image description here

4 - Öffnen Sie die neu hinzugefügte NotFound.cshtml-Datei unter Ansichten/Freigegeben und ändern Sie sie nach Belieben. Führen Sie nun die Anwendung aus und geben Sie eine falsche URL ein. Sie werden mit einer benutzerfreundlichen 404-Seite begrüßt.

enter image description here

Nicht mehr, erhalten Benutzer Fehlermeldungen wie Server Error in '/' Application. The resource cannot be found.

Hoffe das hilft :)

P .: Kudos an Andrew Davey für die Erstellung eines solch fantastischen Plugins.

27
Yasser

Versuchen Sie dies in web.config, um die Fehlerseiten IIS zu ersetzen. Dies ist die beste Lösung, die ich schätze, und sie sendet auch den korrekten Statuscode aus.

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

Weitere Informationen aus Tipila - Benutzerdefinierte Fehlerseiten verwenden ASP.NET MVC

19
Amila

Diese Lösung erfordert keine Änderungen an der Datei web.config oder Catch-All-Routen. 

Erstellen Sie zunächst einen Controller wie diesen;

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

Dann erstellen Sie die Ansicht unter "Views/Error/Index.cshtml" als;

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

Fügen Sie dann in der globalen asax-Datei Folgendes hinzu: 

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

Wenn Sie weiterhin die benutzerdefinierte IIS - Fehlerseite erhalten, stellen Sie sicher, dass die folgenden Abschnitte in der Web-Konfigurationsdatei auskommentiert (oder leer) sind: 

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

Wenn Sie in MVC 4 arbeiten, können Sie diese Lösung anschauen, die für mich funktioniert hat.

Fügen Sie meinem Global.asax die folgende Application_Error-Methode hinzu:

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

Der Controller selbst ist sehr einfach:

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

Überprüfen Sie den vollständigen Quellcode von Mvc4CustomErrorPage unter GitHub .

5
Duc Hoang

Hier ist die richtige Antwort, die eine vollständige Anpassung der Fehlerseite an einem einzigen Ort zulässt. __ Sie müssen die web.config nicht ändern oder separaten Code erstellen.

Funktioniert auch in MVC 5.

Fügen Sie diesen Code dem Controller hinzu:

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

Basierend auf http://www.eidias.com/blog/2014/7/2/mvc-custom-error-pages

0
Andrus

Ich werde über einige spezifische Fälle sprechen,

wenn Sie die 'PageNotFound-Methode' in HomeController wie folgt verwenden

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

das würde nicht funktionieren. Aber Sie müssen Route Tags wie unten löschen,

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

Und wenn Sie es als Methodenname in web.config ändern es funktioniert. Vergessen Sie jedoch nicht, Code wie unten in web.config zu schreiben

<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>
0
Furkan öztürk

Ich hatte das gleiche Problem. Sie müssen nicht das customErrors-Attribut in der Datei web.config im Ordner Views hinzufügen, sondern müssen es in der Datei web.config im Stammordner Ihres Projekts hinzufügen

0
SmokeIT