ASP.NET MVC - Attraper Toutes Itinéraire Et la Route par Défaut
En essayant de faire ma demande pour produire des erreurs 404 correctement, j'ai mis en œuvre un fourre-tout de l'itinéraire à la fin de ma table de routage, comme indiqué ci-dessous:
routes.MapRoute(
"NotFound", _
"{*url}", _
New With {.controller = "Error", .action = "PageNotFound"} _
)
Cependant, pour obtenir ce travail, j'ai dû supprimer la route par défaut:
{controller}/action/{id}
Mais maintenant que le défaut a été supprimé, l'essentiel de mon action liens ne fonctionnent plus, et le seul moyen que j'ai trouvé pour obtenir leur travail est d'ajouter des itinéraires individuels pour chaque contrôleur/action.
Est-il un moyen plus simple de le faire, plutôt que d'ajouter une route pour chaque contrôleur/action?
Est-il possible de créer une route par défaut qui permet encore à la capture de tous les parcours de travailler si l'utilisateur tente d'accéder à une route inconnue?
- Pourquoi pensez-vous 404 ne fonctionnait pas correctement?
- J'ai eu la même plainte que @Sean. ASP.NET renvoie une 404, mais fait ensuite une redirection 302, alors le résultat-il pas un réel 404 sur la page en question. C'est lors de l'utilisation de
customErrors
. - Oui, c'est le même problème que j'ai trouvé, je ne pense pas que c'est SEO friendly
- Dans MVC, l'url ne sont pas toujours liés à un fichier. C'est à dire: domain.com/path/to/destination n'est pas un fichier de structure. Par conséquent, une erreur 404 ne devrait pas être envoyé, car il n'est pas à la recherche d'un fichier.
- IMO, si je vais à
domain.com/nopage
où nopage n'est pas valide d'un contrôleur, il doit y avoir une erreur 404. - tout à fait d'accord, 404 = Pas trouvé, peu importe que ce soit un fichier physique ou pas
- 404 est un FICHIER non trouvé erreur
- HTTP 404 - "La ressource demandée n'a pas pu être trouvé." HTTP / REST est tout au sujet des ressources, et pose la question de ce qu'est un 'fichier'?
Vous devez vous connecter pour publier un commentaire.
Utiliser route contraintes
Dans votre cas, vous devez définir votre itinéraire par défaut
{controller}/{action}/{id}
et de mettre une contrainte sur elle. Probablement lié à des noms de contrôleur ou peut-être même les actions. Ensuite, mettre les attraper tous, l'un après elle et il devrait fonctionner très bien.Alors, quand quelqu'un demande une ressource que l'échec de la contrainte de fourre-tout, la voie devrait correspondre à la demande.
Donc. Définir votre itinéraire par défaut avec la route des contraintes en premier, puis les attraper tous route après:
private static string GetAllControllersAsRegex() { var controllers = typeof(MvcApplication).Assembly.GetTypes().Where(t => t.IsSubclassOf(typeof(Controller))); var controllerNames = controllers.Select(c => c.Name.Replace("Controller", "")); return string.Format("({0})", string.Join("|", controllerNames)); }
AuthorizeAttribute
ou au moins certainsActionMethodSelectorAttribute
de la classe dérivée. Si c'est ce que vous cherchez...Controller.Action(...)
méthode, cette action sera exécuté. Dans votre cas (ce que je comprends) l'URL est.../one/index
points par la configuration du routage àActionOneController.Index(...)
méthode d'action. L'action de la méthode que vous souhaitez exécuter lorsque vous permettre la route, mais refuser méthode d'action? Quelque chose doit être exécutée, sinon il y aura une exception.ajouter cette route à la fin de la routes de la table de
"{*.*}",
a fonctionné pour moi sur asp.net vb comme un fourre-tout"{*.}"
était seulement attraper les routes sans une extension de moi. Changé à"{*.*}"
pour attraper toutes les routes, y compris .aspx.Ah, le problème, c'est votre route par défaut captures tous les 3 segment Url. Le problème ici est que le Routage des pistes de chemin avant de nous déterminer qui va gérer la demande. Ainsi, tous les trois segment de l'URL correspond à l'itinéraire par défaut, même si elle se retrouve plus tard qu'il n'y a pas de contrôleur pour gérer.
Une chose que vous pouvez faire sur votre contrôleur de remplacer le HandleMissingAction méthode. Vous devez également utiliser la balise pour attraper tous les 404 questions.
Bien, ce que j'ai trouvé est qu'il n'y a pas de bonne façon de le faire. J'ai mis le
redirectMode
propriété de lacustomErrors
àResponseRewrite
.Cela me donne la recherché de comportement, mais n'affiche pas la page mise en forme.
Pour moi, c'est mal fait, comme pour le SEO va. Cependant, je pense qu'il y a une solution qui me manque comme c'est exactement ce que je veux. L'URL reste sur l'échec de la page et renvoie une 404. Inspecter stackoverflow.com/fail dans Firebug.
Je recommanderais ce que la plupart des version lisible. Vous avez besoin de ces dans votre RouteConfig.cs, et un contrôleur appelé ErrorController.cs, contenant une action PageNotFound'. Cela peut revenir à un point de vue. Créer un PageNotFound.cshtml, et il va être renvoyé en réponse à la 404:
Comment lire ceci:
= créer un nouveau template de route, avec le nom arbitraire 'PageNotFound'
= utiliser ce modèle de carte tout autrement non gérée routes
= définir l'action à un chemin d'accès incorrect correspondance (la "PageNotFound' Méthode d'Action dans le contrôleur d'Erreur). Cela est nécessaire, car une erreur de saisie de chemin ne sera pas évidemment pas de carte pour toute méthode d'action
Vous êtes probablement mieux de la configuration de l'erreur 404 document dans la section de la configuration, la restauration de la route par défaut.
FWIW, je pense que la route par défaut exigence est retardée trop.
Ma Solution est à 2 pas.
L'origine, j'avais résolu ce problème par l'ajout de cette fonction à mon Global.asax.cs fichier:
Où j'ai essayé de casting Serveur.GetLastError() pour un HttpException, puis vérifié GetHttpCode.
Cette solution est détaillée ici:
ASP.NET MVC Personnalisé Erreur de Manipulation Application_Error Mondiale.asax?
Ce n'est pas la source originale où j'ai obtenu le code. Cependant, cela ne les captures des erreurs 404 qui ont déjà été acheminés. Dans mon cas, qui ment tout niveau 2 URL.
par exemple, ces Url d'affichage, la page 404:
http://www.site.com/blah
http://www.site.com/blah/blah
cependant, http://www.site.com/blah/blah/blah serait tout simplement dire que la page n'a pas pu être trouvé.
L'ajout de vos prises toutes voie APRÈS tous mes autres voies résolu ce problème:
Cependant, la NotFound route ne semble pas acheminer les demandes qui ont des extensions de fichier. Ce n'travail quand ils sont capturés par des voies différentes.
Si vous êtes à la recherche pour ASP.NET Core attraper tous les itinéraires et la recherche sur Google pour
asp.net core catch all route
vous amène ici:ASP.net core, MVC attraper tous les parcours de servir des fichiers statiques