Domanda

È possibile creare un percorso finale che catturi tutto .. e rimbalzi l'utente su una vista 404 in ASP.NET MVC?

NOTA: non voglio configurarlo nelle mie impostazioni IIS.

È stato utile?

Soluzione

Ho trovato la risposta da solo.

Richard Dingwall ha un post eccellente che passa attraverso varie strategie. Mi piace particolarmente la soluzione FilterAttribute. Non sono un fan del gettare eccezioni in giro, volenti o nolenti, quindi vedrò se posso migliorarlo :)

Per global.asax, aggiungi questo codice come ultimo percorso per registrarti:

routes.MapRoute(
    "404-PageNotFound",
    "{*url}",
    new { controller = "StaticContent", action = "PageNotFound" }
    );

Altri suggerimenti

Questa domanda è arrivata per prima, ma la risposta più semplice è arrivata in una domanda successiva:

Routing per la pagina di errore ASP.NET MVC 404 personalizzata

  

Ho fatto funzionare la mia gestione degli errori creando un ErrorController che   restituisce le visualizzazioni in questo articolo. Ho anche dovuto aggiungere il " Cattura tutto "   al percorso in global.asax.

     

Non riesco a vedere come raggiungerà una di queste pagine di errore se non lo è   nel Web.config ..? Il mio Web.config ha dovuto specificare:

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

e poi ho anche aggiunto:

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

Spero che questo aiuti.

Adoro questo modo adesso perché è così semplice:

 <customErrors mode="On" defaultRedirect="~/Error/" redirectMode="ResponseRedirect">
    <error statusCode="404" redirect="~/Error/PageNotFound/" />
 </customErrors>

Inoltre puoi gestire l'errore NOT FOUND in Global.asax.cs come sotto

protected void Application_Error(object sender, EventArgs e)
{
    Exception lastErrorInfo = Server.GetLastError();
    Exception errorInfo = null;

    bool isNotFound = false;
    if (lastErrorInfo != null)
    {
        errorInfo = lastErrorInfo.GetBaseException();
        var error = errorInfo as HttpException;
        if (error != null)
            isNotFound = error.GetHttpCode() == (int)HttpStatusCode.NotFound;
    }
    if (isNotFound)
    {
        Server.ClearError();
        Response.Redirect("~/Error/NotFound");// Do what you need to render in view
    }
}

Aggiungi queste righe nel tuo file web.config di root del progetto.

 <system.webServer>
<httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404" />
  <error statusCode="404" responseMode="ExecuteURL" path="/Test/PageNotFound" />
  <remove statusCode="500" />
  <error statusCode="500" responseMode="ExecuteURL" path="/Test/PageNotFound" />
</httpErrors>
<modules>
  <remove name="FormsAuthentication" />
</modules>

Questo potrebbe essere un problema quando si utilizza

throw new HttpException(404);

Quando vuoi prenderlo, non conosco altro modo che modificare la tua configurazione web.

Un'alternativa alla creazione di un percorso generale è l'aggiunta di un metodo Application_EndRequest al tuo MvcApplication per Risposta MVC 404 migliore di unicorno di Marco .

All'interno di RouterConfig.cs aggiungi il seguente codice:

  routes.MapRoute(
           name: "Error",
           url: "{id}",
           defaults: new
           {
               controller = "Error",
               action = "PageNotFound"

           });

Se la route non può essere risolta, il framework MVC visualizzerà l'errore 404. Il miglior approccio consiste nell'utilizzare i filtri delle eccezioni ... Crea un filtro eccezioni personalizzato e crea in questo modo ...

public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter {
    public void OnException(ExceptionContext filterContext) {
        filterContext.Result  = new RedirectResult("~/Content/RouteNotFound.html");
   }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top