ASP.net MVC - Use o Reflection para descobrir se existe um controlador
Estou tendo um tempo para descobrir como implementar corretamente meu redirecionamento 404.
Se eu usar o seguinte
<HandleError()> _
Public Class BaseController : Inherits System.Web.Mvc.Controller
''# do stuff
End Class
Qualquer erro não tratado na página carregará a visualização "Erro", que funciona muito bem.http://example.com/user/999 (onde 999 é um ID de usuário inválido) gera um erro ao manter o URL original (é isso que eu quero)
Contudo. Se alguém entrarhttp://example.com/asdfjkl no URL (onde asdfjkl é um controlador inválido), o IIS está lançando a página 404 genérica. (isto énão o que eu quero). O que eu preciso é que a mesma coisa acima se aplique. O URL original permanece e o controlador "NotFound" é carregado.
Estou registrando minhas rotas assim
Shared Sub RegisterRoutes(ByVal routes As RouteCollection)
routes.RouteExistingFiles = False
routes.IgnoreRoute("{resource}.axd/{*pathInfo}")
routes.IgnoreRoute("Assets/{*pathInfo}")
routes.IgnoreRoute("{*robotstxt}", New With {.robotstxt = "(.*/)?robots.txt(/.*)?"})
routes.AddCombresRoute("Combres")
routes.MapRoute("Start", "", New With {.controller = "Events", .action = "Index"})
''# MapRoute allows for a dynamic UserDetails ID
routes.MapRouteLowercase("UserProfile", "Users/{id}/{slug}", _
New With {.controller = "Users", .action = "Details", .slug = UrlParameter.Optional}, _
New With {.id = "\d+"} _
)
''# Default Catch All MapRoute
routes.MapRouteLowercase("Default", "{controller}/{action}/{id}/{slug}", _
New With {.controller = "Events", .action = "Index", .id = UrlParameter.Optional, .slug = UrlParameter.Optional}, _
New With {.controller = New ControllerExistsConstraint})
''# Catch everything else cuz they're 404 errors
routes.MapRoute("CatchAll", "{*catchall}", _
New With {.Controller = "Error", .Action = "NotFound"})
End Sub
Observe oControllerExistsConstraint
? O que preciso fazer é usar o Reflection para descobrir se o controlador existe ou não.
Alguém pode me ajudar a preencher os espaços em branco?
Public Class ControllerExistsConstraint : Implements IRouteConstraint
Public Sub New()
End Sub
Public Function Match(ByVal httpContext As System.Web.HttpContextBase, ByVal route As System.Web.Routing.Route, ByVal parameterName As String, ByVal values As System.Web.Routing.RouteValueDictionary, ByVal routeDirection As System.Web.Routing.RouteDirection) As Boolean Implements System.Web.Routing.IRouteConstraint.Match
''# Bah, I can't figure out how to find if the controller exists
End Class
Eu também gostaria de saber as implicações de desempenho disso ... qual é o desempenho pesado do Reflection? Se é demais, existe uma maneira melhor?