Est-il possible de créer un itinéraire final qui capture tout .. et renvoie l'utilisateur à une vue 404 dans ASP.NET MVC?
REMARQUE: je ne souhaite pas configurer ceci dans mes paramètres IIS.
J'ai trouvé la réponse moi-même.
Richard Dingwall a un excellent poste en passant par diverses stratégies. J'aime particulièrement la solution FilterAttribute. Je ne suis pas fan de jeter des exceptions autour de willy nilly, donc je verrai si je peux améliorer ça :)
Pour le global.asax, ajoutez simplement ce code comme dernier itinéraire pour vous inscrire:
routes.MapRoute(
"404-PageNotFound",
"{*url}",
new { controller = "StaticContent", action = "PageNotFound" }
);
Cette question est venue en premier, mais la réponse la plus facile est venue dans une question ultérieure:
Routage pour la page d'erreur ASP.NET MVC 404 personnalisée
La gestion des erreurs a fonctionné en créant un ErrorController qui renvoie les vues dans cet article. Je devais aussi ajouter le "Catch All" à la route dans global.asax.
Je ne vois pas comment cela aboutirait à l'une de ces pages d'erreur si ce n'est pas le cas dans le Web.config ..? Mon Web.config devait spécifier:
customErrors mode="On" defaultRedirect="~/Error/Unknown"
et puis j'ai aussi ajouté:
error statusCode="404" redirect="~/Error/NotFound"
J'espère que cela t'aides.
J'aime cette façon maintenant parce que c'est si simple:
<customErrors mode="On" defaultRedirect="~/Error/" redirectMode="ResponseRedirect">
<error statusCode="404" redirect="~/Error/PageNotFound/" />
</customErrors>
Aussi, vous pouvez gérer l'erreur NOT FOUND dans Global.asax.cs comme ci-dessous
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
}
}
Ajoutez ces lignes sous le fichier web.config de votre projet racine.
<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>
Cela peut être un problème lorsque vous utilisez
throw new HttpException(404);
Quand vous voulez comprendre cela, je ne connais pas d'autre moyen de modifier votre configuration Web.
Une alternative à la création d'un itinéraire fourre-tout consiste à ajouter une méthode Application_EndRequest
à votre MvcApplication
par La réponse MVC 404 Better-Than-Unicorns de Marco .
Dans RouterConfig.cs
, ajoutez le code suivant:
routes.MapRoute(
name: "Error",
url: "{id}",
defaults: new
{
controller = "Error",
action = "PageNotFound"
});
Si la route ne peut pas être résolue, l'infrastructure MVC passera par l'erreur 404 .. La meilleure approche consiste à utiliser des filtres d'exception ... Créez un filtre d'exception personnalisé et procédez comme suit ..
public class RouteNotFoundAttribute : FilterAttribute, IExceptionFilter {
public void OnException(ExceptionContext filterContext) {
filterContext.Result = new RedirectResult("~/Content/RouteNotFound.html");
}
}